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

Jea*_*let 12 scala sbt

假设我公司的一个人有一个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.sbtdatabinding/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)