2015-02-05 18 views
1

GWTP/Gin을 사용하면 컴파일 중에 선택적으로 모듈을 설치할 수 있습니까? 우리는 "개발"모드에서 실행될 때 응용 프로그램에서만 사용할 수있는 발표자와보기를 갖고 싶은 경우가 있습니다.이 모드는 .gwt.xml 파일 (빌드로 설정)의 플래그로 결정됩니다.선택적 모듈 설치

이전에, 우리는 MVC 아키텍처 GXT를 실행하고 우리의 모듈에서 다음을 수행합니다 :

<replace-with class="com.mypackage.DevEditController" > 
    <all> 
     <when-property-is name="isDevelopment" value="true" /> 
     <when-type-is class="com.mypackage.EditController" /> 
    </all> 
    </replace-with> 
    <replace-with class="com.mypackage.StubEditController" > 
    <all> 
     <when-property-is name="isDevelopment" value="false" /> 
     <when-type-is class="com.mypackage.EditController" /> 
    </all> 
    </replace-with> 

을 그리고 다음과 같이 컨트롤러를 만들 것입니다 :

(EditController)GWT.create(EditController.class); 

내가 싶습니다 응용 프로그램의 비 개발 컴파일이이 발표자에 대해 알지 못하는 GWTP와 유사한 작업을 수행하십시오. DesktopModule 및 DevModule이 같은 일을 할 것이지만, DevDesktopModule 발표자를 포함하는 추가 모듈 (TestModule를)로드 할

<set-configuration-property name="gin.ginjector.modules" 
           value="com.mypackage.gin.SharedModule"/> 

if this is development mode: 
<set-configuration-property name="gin.ginjector.module.desktop" 
           value="com.mypackage.gin.DevDesktopModule"/> 
else: 
<set-configuration-property name="gin.ginjector.module.desktop" 
           value="com.mypackage.gin.DesktopModule"/> 

/바인딩 전망 : 기본적으로, 우리의 모듈 파일이의 라인을 따라 뭔가를하고.

이 구성 요소는 구성 관점에서 볼 수 있습니까? 빌드 프로세스에 의해 두 개의 .gwt.xml 파일을 전환하여이 작업을 수행 할 수 있다고 생각했지만 설치 프로세스가 설치되어 있는지 여부에 관계없이 빌드 프로세스는 항상 TestModule 파일을 보았습니다. 이 모듈은 (우리가 그것을 설치하지 않을 경우이 빌드에서이다)

[ERROR] Error injecting com.blah.test.TestPresenter$MyView: Unable to create or inherit binding: No @Inject or default constructor found for com.blah.test.TestPresenter$MyView 
Path to required node: 

com.google.gwt.inject.client.AsyncProvider<com.blah.test.TestPresenter> [com.gwtplatform.mvp.client.ClientGinjector#getcomblahtestTestPresenter()] 
-> com.blah.test.TestPresenter [Implicit injection of com.google.gwt.inject.client.AsyncProvider<com.blah.test.TestPresenter>] 
-> com.blah.test.TestPresenter$MyView [@Inject constructor of com.blah.test.TestPresenter] 

[ERROR] Errors in 'gen/com/gwtplatform/mvp/client/DesktopGinjectorProvider.java' 
[ERROR] Line 8: Failed to resolve 'com.gwtplatform.mvp.client.DesktopGinjector' via deferred binding 
[WARN] For the following type(s), generated source was never committed (did you forget to call commit()?) 

[WARN] com.gwtplatform.mvp.client.com_gwtplatform_mvp_client_DesktopGinjectorImpl 

나는이 문제에 어떤 통찰력을 주셔서 감사합니다, 또는 소스 트리에 존재하지만 설치되지 않을 때 우리가 얻을 오류 메시지입니다 응용 프로그램에 "조건부로 포함 된"모듈을 갖는 대안 솔루션.

답변

0

나는 Activity/Place 아키텍처 대신에 GWTP을 사용하지 않습니다. 필자는 다음과 같은 해결책이 적절한 경우를 발견했습니다.

*.gwt.xml*의 구성 매개 변수는 빌드 스크립트에 의해 설정되고 나중에 EntryPoint으로 구문 분석됩니다.

<define-configuration-property name="demoMode" is-multi-valued="true" /> 
<extend-configuration-property name="demoMode" value="false" /> 

이 매개 변수를 기반으로 한보기/표현 자 구성이 있으며 올바른보기가 GIN 모듈에서 초기화됩니다. 다른

@Provides @Singleton 
public LoginView getLoginView() { 
    if (SharedState.IS_DEMO_MODE) { 
    return new LoginViewMobileDemo(); 
    } else { 
    return new LoginViewMobile(); 
    } 
} 
0

경우 아무도 내가 주 응용 프로그램 소스 트리에서 제거, 독립 GWT 모듈에 옵션 모듈 코드를 이동 한 일을 결국 어떤 비슷한 상황 ...로 실행됩니다. 그런 다음 모듈은 응용 프로그램 .gwt.xml 파일에서 선택적으로 상속됩니다 (빌드 프로세스에 따라).

이 설정을 한 후에도 바인딩 생성 또는 상속에 대한 진 경고 메시지가 표시됩니다. 응용 프로그램 .gwt.xml 파일에서 지정된 순서로 문제를 추적했습니다. 나는 "gin.ginjector.modules"를 설정하기 전에 상속을하고있었습니다. 일단 명령을 변경하면 모든 것이 예상대로 작동했습니다.

<set-configuration-property name="gin.ginjector.modules" value="com.test.app.SharedModule"/> 

<inherits name="com.test.optional.OptionalModule" />