在sbt中是否存在与Leiningen的"checkout "功能等效的功能?
这是我想要完成的:
我有两个项目,一个应用Foo和库"Bar"。我想独立出版每一个项目。Foo依赖于Bar,当第三方试图构建"Foo"(这是典型的行为)时,sbt项目将指示sbt从存储库下载"Bar"的jar。
现在,假设我想同时修改Foo和Bar。例如,在Foo上工作时,我想直接编辑和调试Bar的一些源代码,以便编辑影响Foo(然后在方便时重新构建Bar)。 在这个hack会话期间,我如何指示sbt在我的机器上(而不是我的本地存储库)的源代码中满足它对Bar的依赖?(注:我问了Clojure/Leiningen一个类似的问题。Leiningen的"checkout"功能可以实现这一点。我想知道是否有类似的东西…)
您可以通过项目引用声明从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匹配,如果您使用简单的构建定义(仅.sbt
文件),则可能是default-edd2f8
。
这项技术对于插件特别有用(参见我的博客文章关于这个主题)。
编辑:你可以像这样重新编码结帐行为:
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
)。如果目录不存在,构建就像以前一样工作。
当您在checkout目录(或目录本身)中添加或删除符号链接时,您必须重新加载Foo项目以获取更改。