假设我公司的一个人有一个名为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存储库中,我们无法嵌套。
如何正确指定此依赖关系?
答案 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.scala
和databinding/project/Build.scala
上的配置分别迁移到commons/build.sbt
和databinding/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)
您可以拥有两个单独的项目,只需在本地发布其中一个项目,将其作为普通库依赖项添加到另一个项目中。