假设我公司的一个人有一个sbt项目叫做commons非常通用.该项目以传统的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
Run Code Online (Sandbox Code Playgroud)
如何指定首先databinding需要commons构建并使用输出类文件?
我阅读了多项目构建,并为以下构建定义提出了以下内容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")
)
}
Run Code Online (Sandbox Code Playgroud)
除非它不起作用:sbt不喜欢..并抛出AssertionError.显然,commons应该是一个文件夹里面databinding.但是这两个项目都保存在单独的git存储库中,我们无法嵌套.
如何正确指定这种依赖?
Dav*_*vid 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)
}
Run Code Online (Sandbox Code Playgroud)
另外一件事,SBT不支持*.scala子项目中的配置文件.这意味着,你将不得不迁移你所做的配置commons/project/Build.scala,并databinding/project/Build.scala分别进入commons/build.sbt和databinding/build.sbt.
如果您的某些配置不适合.sbt定义文件,则必须在根目录中添加它们project/Build.scala.显然,root Build.scala中定义的设置在*.sbt文件中可用.
小智 10
您应该使用RootProject(在引用另一个项目的根项目的情况下)或ProjectRef(在引用另一个项目的子项目的情况下).
以下是使用RootProject的示例:
lazy val commons = RootProject(file("../commons"))
lazy val root = Project(id = "databinding", base = file(".")) settings (...) dependsOn (commons)
Run Code Online (Sandbox Code Playgroud)
这是使用ProjectRef的示例
lazy val commons = ProjectRef(file("../commons"), "sub-project")
lazy val root = Project(id = "databinding", base = file(".")) settings (...) dependsOn (commons)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5872 次 |
| 最近记录: |