2017-09-30 1 views
0

複数のSBTプロジェクトでは、メインのWebアプリケーションはいくつかのサブプロジェクトに依存しています。 私はStubbedモデルを考えていたときに、スタブ付きモデルの実装を分割されたサブプロジェクトにしたいと思います。SBT動的プロジェクトの依存関係(コマンドライン引数に基づく)

問題:SBTプロジェクトの依存関係は、SBTで事前定義されています。私はそれをコマンドラインでサブプロジェクトの一つまたは他のものに依存して動的にすることはできません。

つまり、実際に実装されたモジュールに依存するWebアプリケーションや、同じプロジェクトツリー内のスタブされたモジュールにのみ依存するWebアプリケーションを作成するためのスタブ付きビルドを作成するための「リリースビルド」はできません。

依存関係を分離するためのアイデアは次のとおりです。スタブ・ド・ジャーを含む製品リリースの戦争を望んでいません。スタブ付きジャーは、テスト環境でのみ使用できます。

質問:コマンドライン引数を使用して、SBTに依存するサブプロジェクトを伝えることはできますか?

通常の桟橋でプロジェクトを開始するときは、まずメインプロジェクトを通常のサブプロジェクトに依存させる必要があります。 '-Stub = true'のようなコマンドラインで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を実行すると、私たちはモデルスタブ行うことができます。SBTがない場合

./sbt ~jetty:start -Stub = true 

または通常モデルで

./sbt ~jetty:start 

をこれをサポートして、このような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では、依存関係を変更する必要はありません。依存プロジェクトを1つだけ持つように使用してください。

それを必要とする

は、コマンドライン実行し、スタブモデルで実行する:

export Stub=true 

はその後、通常のSBTクリーンビルドを開始し、その後、WebAppのプロジェクトは、コマンドを実行するとStubDataTier

にリンクします行:

export Stub=false 

次に、webAppはlivedataTierを依存関係サブプロジェクトとして使用します。

デフォルトでは、依存関係としてlivedataTierになります。

これは私にとって素晴らしい作品です。

注:2つの依存関係を切り替えるときは、クリーンビルドを行う必要があります。

関連する問題