我们正在使用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“方式”吗?