web-dev-qa-db-ja.com

sbt0.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ファイルが1つの概念ファイルに集約されることも知っています。

しかし、私が本当に望んでいるのは、12個のサブプロジェクト.sbtファイルでルートを汚染しないことです。サブプロジェクトbuild.sbtファイルをそれぞれのサブディレクトリにスローし、それらの間の共通コードをどこかで共有し、サブプロジェクトを集約するプロジェクト全体のルートbuild.sbtを作成する方法はありますか?私は現在.scalaファイルで同様の設定をしていますが、可能であれば.sbtファイルを使用したいと思います。

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

35
Mysterious Dan

0.12では、サブプロジェクトのベースディレクトリに.sbtファイルを配置でき、そこでの設定がそのプロジェクトのスコープに含まれるようになっているはずです。

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

デフォルトのルートプロジェクトは、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の定義と重複しています。

今後可能な解決策は、次のようにルート定義を単なる参照にすることです。

<root>/build.sbt

lazy val sub = LocalProject("sub")
23
Mark Harrah