5

これがしばらくの間可能かどうかを探していましたが、ほとんど成功していません。

SBT を使用して、各プロジェクトを独自のプロジェクトに明示的に割り当てることなく、プログラムでサブプロジェクトを作成できますvalか?

私の現在のプロジェクト構造は次のようになります。

root/
    common/ <--- This is another sub-project that others dependOn
    project/
        build.scala
    src/main/scala
    apps/ <--- sub-projects live here
        Sub1/
        Sub2/

Sub1両方ともSub2独自の SBT プロジェクトです。

これらのプロジェクトをリンクする最初の試みは次のようになりました。

// root/project/build.scala
import sbt._
import Keys._
object build extends Build {
  lazy val common = project /* Pseudo-code */
  val names = List("Sub1", "Sub2")
  lazy val deps = names map { name =>
    Project(id = name, base = file(s"apps/$name")).dependsOn(common)
  }

  lazy val finalDeps = common :: deps
  lazy val root = project.in(file(".")).aggregate(finalDeps.map(sbt.Project.projectToRef) :_*)
                 .dependsOn(finalDeps.map(ClassPathDependency(_, None)) :_*)
}

ただし、SBT はリフレクションを使用してそのプロジェクトとサブプロジェクトを構築するため、これは機能しません。

各サブプロジェクトが明示的に記述されている場合にのみ機能します。

lazy val Sub1 = project.in(file("apps/Sub1"))

だから質問:

SBT でサブプロジェクトの依存関係をプログラムで構築する方法はありますか?

4

1 に答える 1

2

Sbt では、ビルド自体のビルド定義を作成できます。

http://www.scala-sbt.org/release/docs/Getting-Started/Full-Def.html

次のようなソース ジェネレータを含む project/project/build.scala ファイルの作成を試すことができます。

// project/project/build.scala
sourceGenerators in Compile <+= sourceManaged in Compile map { out =>
    Generator.generate(out / "generated")
}

編集: Generator オブジェクトを自分で実装する必要があります。

このソース ジェネレーターは、最上位のアプリ フォルダーをスキャンし、すべてのサブプロジェクトを含むオブジェクトのソースを作成します。

// project/subprojects.scala
// This is autogenerated from the source generator
object Subprojects{
  lazy val Sub1 = project.in(file("apps/Sub1"))
  lazy val Sub2 = project.in(file("apps/Sub2"))
  lazy val all = Seq(Sub1,Sub2)
}

次に、メインの build.scala に次のように記述します。

// project/build.scala
lazy val root = project.in(file("."))
  .aggregate(Subprojects.all.map(sbt.Project.projectToRef) :_*)
  .dependsOn(Subprojects.all.map(ClassPathDependency(_, None)) :_*)

これらすべてをコンパイラで実行したわけではないため、エラーが発生する可能性がありますが、原則は機能するはずです。

編集:ソリューションを実装した Github にレポを作成しました。そこに行って、それがどのように行われるかを見てください。

https://github.com/darkocerdic/sbt-auto-subprojects

于 2014-04-18T18:14:39.840 に答える