设置sbt环境,一次攻击多个库



在sbt中是否存在与Leiningen的"checkout "功能等效的功能?

这是我想要完成的:

我有两个项目,一个应用Foo和库"Bar"。我想独立出版每一个项目。Foo依赖于Bar,当第三方试图构建"Foo"(这是典型的行为)时,sbt项目将指示sbt从存储库下载"Bar"的jar。

现在,假设我想同时修改FooBar。例如,在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-edd2f8bar)。如果目录不存在,构建就像以前一样工作。

当您在checkout目录(或目录本身)中添加或删除符号链接时,您必须重新加载Foo项目以获取更改。

相关内容

  • 没有找到相关文章

最新更新