2017-09-30 17 views
0

SBT 여러 프로젝트에서 기본 웹 응용 프로그램은 일부 하위 프로젝트에 의존합니다. 스텁 베드 모델을 생각할 때 스텁 모델 구현을 분리 된 하위 프로젝트로 만들고 싶습니다.SBT 동적 프로젝트 종속성 (명령 줄 인수 기반)

문제점 : SBT 프로젝트 종속성은 SBT에서 미리 정의됩니다. 커맨드 라인에 의해 서브 프로젝트 중 하나 또는 다른 프로젝트에 따라 동적으로 만들 수는 없습니다.

즉, 웹 앱이 실제 구현 된 모듈에만 의존하거나 "스텁 된 빌드"를 사용하여 웹 응용 프로그램이 동일한 프로젝트 트리의 스텁 모듈에만 종속되도록 만드는 "릴리스 빌드"를 가질 수 없음을 의미합니다 .

종속성을 분리하는 아이디어는 다음과 같습니다. 제품 출시 전쟁에 스텁이있는 병이 포함되기를 원하지 않습니다. 스텁 된 항아리는 테스트 환경에서만 사용할 수 있어야합니다.

질문 : 명령 줄 인수를 사용하여 SBT에게 어떤 하위 프로젝트가 의존하게 할 수 있습니까?

일반적인 부두에서 프로젝트를 시작할 때 : 시작, 기본 프로젝트는 정규 서브 프로젝트에 의존해야합니다. '-Stub = true'와 같은 명령 줄을 사용하여 SBT를 시작하면 주 프로젝트가 종속 프로젝트를 스텁 서브 프로젝트로 변경하고 싶습니다. 시간을 제공하기 때문에 스텁 모델이나 정규 스텁 모델에서 컴파일러가 종속성을 업데이트 할 수있는 기회를 가져야합니다. SBT에서 할 수 있습니까? SBT를 실행하면

lazy val DataTier = Project(
    id = "dataTier", 
    base = file("dataTier")) 
} 

lazy val StubbedDataTier = Project(
    id = "stubbeddataTier", 
    base = file("stubbeddataTier")) 
} 

lazy val webApp = Project(
"tiny-web", 
    file(".")) 
.aggregate(
    DataTier, 
    StubbedDataTier 
) 
.dependsOn(
    if (getCmdLineArg("Stub") == "true") StubbedDataTier else DataTier 
) 

, 우리는 스텁 할 수있는 모델 : 여기

은 샘플 프로젝트
./sbt ~jetty:start -Stub = true 

또는 일반 모델의

./sbt ~jetty:start 

SBT하지 않는 경우 그것을지지하십시오, SBT를위한 새로운 특징이 될 수 있습니까?

.dependsOn(
    if (getCmdLineArg("Stub") == "true") StubbedDataTier else DataTier 
) 

답변

0

내 질문에 답변 해 주셔서 죄송합니다. 뭔가를 시도한 후에 몇 가지 해결 방법을 발견 했으므로 여기서 공유하여 다른 사람들에게 도움이 될 수 있습니다.

명령 줄을 사용하는 대신 환경 변수를 사용하여 프로젝트 링크를 동적으로 제어합니다. 여기

프로젝트 구성의 예이다

lazy val DataTier = Project(
    id = "dataTier", 
    base = file("dataTier")) 
    .settings(commonSettings: _*) 

lazy val LiveDataTier = Project(
    id = "livedataTier", 
    base = file("livedataTier")) 
    .settings(commonSettings: _*) 
    .dependsOn(
    DataTier 
) 

lazy val StubDataTier = Project(
    id = "stubdataTier", 
    base = file("stubdataTier")) 
    .settings(commonSettings: _*) 
    .dependsOn(
    DataTier 
) 

lazy val webApp = Project("my-web", 
    file(".")) 
.aggregate(
    DataTier, 
    LiveDataTier, 
    StubDataTier 
) 
.dependsOn(
    DataTier 
) 

lazy val stubbed = System.getenv("Stub") match { 
    case "true" => { 
    System.out.print("The Stubbed model is turned on\n") 
    webApp.dependsOn(
     StubDataTier 
    ) 
    } 
    case _ =>{ 
    System.out.print("The Stubbed model is turned off\n") 
    webApp.dependsOn(
     LiveDataTier 
    ) 
    } 
} 

정의 데이터 계층 인터페이스 만 다음 LiveDataTier StubDataTier와 동일한 데이터 계층에 대한 두 세트의 구현을 수행. webApp에서는 종속성에 대한 어떠한 전환도 필요가 없으며 하나의 종속성 프로젝트 만있는 것처럼 사용할 수 있습니다.

을 필요로

명령 줄 실행 스텁 모델에서 실행되도록 :

export Stub=true 

그런 다음 정상 SBT 정리 빌드를 시작, 다음, 웹 애플리케이션 프로젝트는 명령을 실행하여 StubDataTier

로 연결됩니다 line :

export Stub=false 

그런 다음 webApp는 livedataTier를 종속성 하위 프로젝트로 사용합니다.

기본적으로 livedataTier가 종속성으로 사용됩니다.

내게 잘 맞습니다.

참고 : 두 종속성 사이를 전환 할 때 새로 빌드해야합니다.