在sbt中是否有相当于Leiningen的“结账”功能?
这是我想要完成的事情:
我有两个项目,一个应用程序 Foo 和一个库“ Bar ”。我想独立发布这些项目。 Foo 取决于栏,只要第三方尝试,sbt项目就会指示sbt从存储库下载“ Bar ”的jar建立“Foo”(这是典型的行为)。
现在,我想同时破解 Foo 和 Bar 。例如,在处理 Foo 时,我想直接编辑和调试栏的部分来源,以便编辑影响 Foo (然后稍后在方便的时候重建栏。
在此黑客会话期间,如何指示sbt在我的机器(而不是我的本地存储库)上的源代码中满足其对 Bar 的依赖?
(P.S。我向similar question询问了Clojure / Leiningen。Leiningen有"checkouts"功能来实现这一点。我想知道是否有类似的东西......)
答案 0 :(得分:9)
您可以通过项目引用声明从Foo到Bar的源依赖项:
import sbt._
object FooBuild extends Build {
lazy val root = Project(
id = "foo",
base = file(".")
) dependsOn(theBarBuild)
lazy val theBarBuild = ProjectRef(
base = file("/path/to/bar"),
id = "bar")
}
每当编译Foo时,这也应该重新编译Bar(如果已经更改)。请注意,项目引用的id
必须与Bar项目的实际ID匹配,这可能类似于例如default-edd2f8
如果您使用简单的构建定义(仅.sbt
个文件)。
此技术对插件特别有用(请参阅我的blog post关于此主题)。
修改强>
您可以像这样重新编码结帐行为:
import sbt._
object FooBuild extends Build {
lazy val root = addCheckouts(Project(id = "foo", base = file(".")))
def addCheckouts(proj: Project): Project = {
val checkouts = proj.base.getCanonicalFile / "checkouts"
if (! checkouts.exists) proj
else proj.dependsOn(IO.listFiles(DirectoryFilter)(checkouts).map { dir =>
ProjectRef(base = dir, id = dir.name): ClasspathDep[ProjectReference]
}:_*)
}
}
这将检查项目目录中的checkouts
目录,如果存在,则将其中的目录(应该是符号链接到其他项目)添加为项目的项目引用。它希望将符号链接命名为链接项目的实际ID(例如default-edd2f8
或bar
)。如果目录不存在,那么构建就像以前一样工作。
在checkouts目录(或目录本身)中添加或删除符号链接时,必须重新加载Foo项目以获取更改。
希望这有帮助。