sbtサブプロジェクトを定義する3つの方法


sbtがサブプロジェクトを定義する標準的な方法は、サブプロジェクトを親プロジェクトのディレクトリの下に配置し、親プロジェクトのBuild.scalaでは、サブプロジェクトとその依存関係を定義します.しかし、この方法では、特にサブプロジェクトが複数の独立したプロジェクト間で共有される場合、サブプロジェクトを親プロジェクトディレクトリの下に置くことが望ましくありません.この方法はここでは言わないが,サブプロジェクトを親プロジェクトディレクトリの下に置かない場合,sbtは他の2つの方法を提供する.
1つ目の方法は、プロジェクトリファレンスと呼ばれます.commonsubサブプロジェクトが/some/place/commonsubの下に置かれ、メインプロジェクトが/another/place/mainProjectの下に置かれている場合、この2つのディレクトリはまったく関連していません.メインプロジェクトではcommonsubを参照できます.

   lazy val common = RootProject( file("/some/place/commonsub") )
   ……
   val main = Project("main", file(".")) dependsOn(common)

実現は簡単ですが、ProjectをRootProjectに変更しただけで、commonsub-sub、つまりサブプロジェクトなどのcommonsubの次のサブプロジェクトを参照する場合は、RootProjectをProjectRefに変更すればいいです.RootProject、ProjectRefはgit倉庫やパッケージを作ったjarを参照することもできます.具体的には、参照してください.
sbtドキュメント .注意すべき点は、外部項目を参照する場合、メイン項目でsbtを設定することである.boot.Directoryという環境変数は、sbt起動スクリプトに設定すればいいです.
最後の方法は、サブプロジェクトをパッケージ化してパブリッシュし、メインプロジェクトにサブプロジェクトへの依存を加えることですので、厳密に言えば、サブプロジェクトを定義するわけではありませんが、確かに作業できます.sbtは、プロジェクトをmavenまたはivy倉庫にパッケージ化することができます.この倉庫はリモートでもローカルでも構いません.便宜上、commonsubをローカルにパブリッシュする場合は、commonsubのプロジェクト定義に次のように追加します.

   publishTo := Some(Resolver.file("file",  new File(Path.userHome.absolutePath+"/.m2/repository")))  //         

次にsbt shellでpublishコマンドを実行すると、commonsubを指定した場所にパッケージしてパブリッシュすることができます.上のコードでは、mavenローカルウェアハウスにパブリッシュするように設定されています.他のディレクトリにも指定できます.次に、メインプロジェクトにcommonsubへの依存度を追加します.

   resolvers += "Local Maven Repository" at "file://"+Path.userHome.absolutePath+"/.m2/repository"

   libraryDependencies += "com.yourCompany" % "commonsub" % "X.X.X"

この方法は比較的面倒であり、また、異なるscalaバージョンのコンパイルの結果は互換性がない可能性があるため、2つのプロジェクトは同じscalaバージョンでコンパイルされることに注意する必要があります.
いずれにしても、プロジェクトの更新時にサブプロジェクトへの参照を更新することを忘れないでください.第2の方法では、対応するバージョンのソースコードを自分でcheckoutする必要があります.第3の方法では、どのバージョンのサブプロジェクトに依存するかを明示的に定義する必要があります.比較的、この方法は忘れにくいです.