假设我们有一个SBT项目bar
,它依赖于某个工件foo
:
val bar = Project('bar', file('.')).settings(
libraryDependencies += "com.foo" % "foo" % "1.0.0"
)
但是,在某些情况下,我想检查foo
的来源并让SBT从我的文件系统而不是已发布的工件加载源代码;这样,我就可以对foo
进行本地更改,并立即使用bar
对其进行测试,而无需发布任何内容。
val foo = Project('foo', file('foo'))
val bar = Project('bar', file('.')).dependsOn(foo)
我们在spec.json
的根文件夹中有一个bar
文件,该文件已指定是应该从源使用foo
还是作为工件。有没有办法设置我的构建来阅读此文件,并根据dependsOn
中的值添加libraryDependencies
或spec.json
? “
为libraryDependencies
:
val bar = Project('bar', file('.')).settings(
libraryDependencies ++=
if (containsFoo(baseDirectory.value / "spec.json")) {
Seq()
} else {
Seq("com.foo" % "foo" % "1.0.0")
}
)
但是,我们找不到任何方法来设置dependsOn
中的“动态”内容,例如阅读baseDirectory
SettingKey
。
答案 0 :(得分:2)
我们尝试了一些方法,但是我们唯一可以开始工作且感觉不可理解/不可维护的黑客就是添加一个implicit class
,为Project
添加一个方法可以在本地添加依赖项或作为工件添加依赖项。
实施的伪代码大纲:
implicit class RichProject(val project: Project) extends AnyVal {
def withSpecDependencies(moduleIds: ModuleID*): Project = {
// Read the spec.json file that tells us which modules are on the local file system
val localModuleIds = loadSpec(project.base / "spec.json")
// Partition the passed in moduleIds into those that are local and those to be downloaded as artifacts
val (localModules, artifactModules) = moduleIds.partition(localModuleIds.contains)
val localClasspathDependencies = toClasspathDependencies(localModules)
project
.dependsOn(localClasspathDependencies: _*)
.settings(libraryDependencies ++= artifactDependencies)
}
}
实际SBT构建中的使用模式非常简单:
val foo = Project("foo", file("foo")).withSpecDependencies(
"com.foo" % "bar" % "1.0.0",
"org.foo" % "bar" % "2.0.0"
)
答案 1 :(得分:0)
Mecha
构建自动化SBT插件执行此操作取决于本地文件系统上是否有其他项目。这是一个新项目,因此文档很少,但您可以查看其来源:https://github.com/storm-enroute/mecha