2013-07-25 11 views
34

.sbtファイルは0.13でさまざまな方法で改善されていると聞いており、今ではそれらにマルチプロジェクトビルドを指定できるようになりました。sbtで.sbtファイルを使ったマルチプロジェクトビルドを書くための慣習的な方法0.13

http://www.scala-sbt.org/0.13.0/docs/Community/ChangeSummary_0.13.0.html#sbt-format-enhancementsここで、サブプロジェクトを.sbtファイルで定義できることを説明します。私はまた、ルート内の複数の.sbtファイルが単一の概念ファイルに集約されることも知っています。

私が本当に好きなのは、十数個のサブプロジェクト.sbtファイルで自分のルートを汚染しないことです。サブプロジェクトbuild.sbtファイルをそれぞれのサブディレクトリに投げ込み、それらの間にいくつかの共通コードを共有しておき、サブプロジェクトを集約するプロジェクト全体のルートbuild.sbtを作成する方法はありますか?私は.scalaファイルに似た設定をしていますが、可能であれば.sbtファイルを使用する方が好きです。

これが不可能な場合は、.sbtファイルで大規模なマルチプロジェクトビルドを構築する "正しい"方法は何ですか?

答えて

23

サブプロジェクトのベースディレクトリに.sbtファイルを置くことができるのは、既に0.12の場合です。そこにある設定は、そのプロジェクトのスコープに含まれます。

コードは、.sbtファイルの間で、.scalaファイルをproject/に作成して再利用します。 project/のコードは、.sbtファイルで使用できます。 .sbtの定義は、他の.sbtファイルには表示されません。少なくとも0.13になります。これは主に実装の制限であり、将来のバージョンでこれが解除されるかどうかは不確定です。

デフォルトのルートプロジェクトは、subProject/build.sbtで定義されたプロジェクトからのサブプロジェクトを含むすべてのサブプロジェクトを集計します。

現在の難しさは明示的にしています。 たとえば、ルートディレクトリの次のbuild.sbtは、サブプロジェクトをsub/に定義します。 これは完全な定義で、プロジェクトのID、ベースディレクトリなどを定義します。

<root>/build.sbt

lazy val sub = project 

しかし、それは<sub>/build.sbtで定義されたものを参照することはできません。 (sub/build.sbtの存在は<root>/build.sbtがコンパイルされ、評価されるまで知られていない。) だから、明示的に何sub凝集体を定義するために、次のような何か必要があると思います:

sub/build.sbt

lazy val sub = project.in(file(".")).aggregates(subSub) 
//or: lazy val sub = project in file(".") aggregate subSub 

lazy val subSub = project 

しかし、この重複をsubの定義。今後

可能な解決策は、ルート定義にちょうど参照を作ることです、のような:0.13のよう

<root>/build.sbt

lazy val sub = LocalProject("sub") 
+0

、私はしかし.sbtファイル内のプロジェクト定義を追加することができます。もし私が 'subproject1/build.sbt'にそのようなプロジェクトの値を置き、サブプロジェクトのビルドを集約するルートプロジェクトを定義したいのであれば? .sbtファイルの間に値が表示されない場合は、集約するか、クロスサブプロジェクトの依存関係を作成するのが難しいようです。 –

+0

私の究極の目標は、可能な限りサブプロジェクトをコンパートメント化し、共通の.scalaファイルに入れる必要のあるコードの量を最小限に抑えることです。私は間違いなくサブプロジェクト間に共通のコードをいくつか残しておく必要がありますが、できるだけ独立したものにしたいと考えています。 –

+0

あなたのコメントに対処するために更新されました。指示された解決策は実装されておらず、概念的な解決策にすぎません。 –

関連する問題