2011-11-30 5 views
12

私の会社の一人の男が、かなり汎用的なcommonsというsbtプロジェクトを持っているとします。このプロジェクトは伝統的なsbtの方法で定義されています:project/Build.scalaファイルのビルド定義を持つメインフォルダにあります。これを指定してプロジェクトをビルドする方法別のプロジェクトBを最初にビルドする必要がありますか?

commonsに依存するdatabindingというプロジェクトを開発している男がいます。このプロジェクトは同じ方法で定義したいと考えています。project/Build.scalaです。

私たちは、次のディレクトリのレイアウトを持っている:

dev/ 
    commons/ 
    src/ 
     *.scala files here... 
    project/ 
     Build.scala 
    databinding/ 
    src/ 
     *.scala files here... 
    project/ 
     Build.scala 

どのように私はdatabindingが最初に構築され、出力クラスファイルを使用することがcommonsが必要であることを指定することができますか?

私はMulti-project buildsを読み、databindingのビルド定義のために、次のを思い付いた:

object MyBuild extends Build { 

    lazy val root = Project(id = "databinding", base = file(".")) settings (
    // ... omitted 
) dependsOn (commons) 

    lazy val common = Project(id = "commons", 
    base = file("../commons") 
) 

} 

それが動作しない場合を除き:SBTは..が好きでAssertionErrorがをスローしません。明らかに、commonsdatabindingのフォルダにする必要があります。しかし、これらの2つのプロジェクトは別々のgitリポジトリに保存されています。

どのようにこの依存関係を適切に指定できますか?

答えて

12

マルチプロジェクトをdev/project/Build.scalaで定義されるルートプロジェクト(またはそれに適した名前ですが、これに適しています)に定義する必要があります。

object RootBuild extends Build { 
    lazy val root = Project(id = "root", base = file(".")) 
    .settings(...) 
    .aggregate(commons, databinding) 

    lazy val commons = Project(id = "commons", base = file("commons")) 
    .settings(...) 

    lazy val databinding = Project(id = "databinding", base = file("databinding")) 
    .settings(...) 
    .dependsOn(commons) 
} 

もう一つ、SBTは、サブプロジェクトに*.scala設定ファイルをサポートしていません。つまり、commons/project/Build.scaladatabinding/project/Build.scalaで行った設定をそれぞれcommons/build.sbtdatabinding/build.sbtに移行する必要があります。

設定の一部が.sbt定義ファイルに適していない場合は、ルートproject/Build.scalaに追加する必要があります。明らかに、ルートBuild.scalaで定義された設定は*.sbtファイルで利用可能です。

+0

感謝を使用するためのサンプルです。これは奇妙に思えます。他のプロジェクトが私のプロジェクト 'commons'を使用しているだけなので、' .scala'ファイルに完全な定義を持つことはできませんか? –

+0

さらに、依存するプロジェクトによって生成されたjarをルックアップするリゾルバを追加するなどの方法がありますか? –

+0

あなたの最初の質問に関しては、あなたが '* 'を使うのを妨げるのはSBTの制限です。サブプロジェクトを定義するための「scala」ファイルを作成します。 SBTがプロジェクト定義ファイルをマージする方法の限界だと私は思う。幸いにも '* .sbt'ファイルはルートプロジェクト' Build.scala'からval、settings ...にアクセスできます。 2番目のコメントでそれを言及すると、ローカル(publish-local)に 'common'を公開し、リゾルバはそれを取得しなければなりません。 SNAPSHOTシステムを使用する場合は、依存関係定義に 'isChanging()'を追加してください。これが役立つことを願っています。 – David

1

2つの別々のプロジェクトを作成し、そのうちの1つをローカルに公開し、それを通常のライブラリ依存関係として他のものに追加することができます。

10

RootProject(別のプロジェクトのルートプロジェクトを参照する場合)またはProjectRef(別のプロジェクトのサブプロジェクトを参照する場合)を使用する必要があります。ここで

はRootProjectを使用してのサンプルです:

 lazy val commons = RootProject(file("../commons")) 
     lazy val root = Project(id = "databinding", base = file(".")) settings (...) dependsOn (commons) 

そして、ここではProjectRef

に多くの説明、デビッドのため
 lazy val commons = ProjectRef(file("../commons"), "sub-project") 
     lazy val root = Project(id = "databinding", base = file(".")) settings (...) dependsOn (commons) 
+0

この 'RootProject'は新しいですか?この新しいAPIはDavidの推奨ソリューションを無効にしますか? –

+0

そうですね。いいえ、でも少しシンプルだと思います。 –

+1

2つのプロジェクトが独立しているという目的を破るマイグレーションなしに、承認された回答がどのようにOPのために働いているのか理解できません。ルートプロジェクトのため、移行後には移行しません。 –

関連する問題