跨SBT跨多个存储库构建多模块项目

时间:2016-07-18 14:55:50

标签: scala sbt

我们正在使用SBT和常春藤,但是在多模块项目中存在问题。我不确定是否有更好的方法来做我们正在尝试做的事情。

我们有一个父模块,它聚合子模块:

lazy val `foo-parent` = (project in file("."))
  .aggregate(`foo-layout`,`foo-environment`,...)
  .settings(commonSettings: _*)

还有一些子模块,例如:

lazy val `foo-layout` = Project("foo-layout", file("foo-layout"))
  .settings(commonSettings: _*)
  .settings(
    libraryDependencies ++= Seq(
      `...),
    name := "foo-layout"
  ).dependsOn(`foo-config`)

我们有一个库的核心模块,聚合在foo-parent,所有都在同一个git repo中,而“实现”模块则用于单独的repos中的客户端。在实现模块中,我们用于将子模块作为库依赖项导入,例如:

libraryDependencies += "com.foo" %% "foo-layout" % foo_version

这个问题是在foo-parent中更改任何内容时必须手动执行sbt publishLocal,或者在IntelliJ中将模块设置为“模块依赖项”,每次项目运行时重置为使用JAR刷新。

现在我们有了一个符号链接“foo-source”,它链接到所有子模块所在的目录“foo-parent”,并且在使用源和JAR之间切换有一种错误的感觉。

val compileFooFromSource = false
lazy val foo_parent: Project = Project("foo-parent", file("foo-source"))
lazy val foo_dependencies = Seq("foo-environment", "foo-layout", ...)
lazy val test: Project = compileFooFromSource match {
  case false =>
    Project("test", file("."))
      .settings(artifactSettings: _*)
      .settings(
        libraryDependencies ++= foo_dependencies.map( mod =>
          ("com.foo" % mod % version.value)
        )
      )
  case true =>
    Project("test", file("."))
      .settings(artifactSettings: _*)
      .dependsOn(foo_dependencies.map(s => classpathDependency(s)): _*)

}

这种方法依赖于符号链接,这可能会导致Windows开发人员或CI出现问题(我们必须记住在提交之前将源标志更改为false,否则CI将中断。) 这是在多个回购中构建这样的多模块项目的唯一方法吗?还有更多的SBT“方式”吗?

0 个答案:

没有答案