如何指定构建项目必须首先构建另一个项目B?

时间:2011-11-30 17:19:18

标签: scala sbt

假设我公司的一个人有一个名为commons的sbt项目非常通用。该项目以传统的sbt方式定义:在project/Build.scala文件中具有构建定义的主文件夹中。

现在其他一些人正在开发一个名为databinding的项目,该项目取决于commons。我们希望以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。显然,commons应该是databinding内的文件夹。但是这两个项目都保存在单独的git存储库中,我们无法嵌套。

如何正确指定此依赖关系?

3 个答案:

答案 0 :(得分: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中定义的设置。

答案 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)

答案 2 :(得分:1)

您可以拥有两个单独的项目,只需在本地发布其中一个项目,将其作为普通库依赖项添加到另一个项目中。