gpt4 book ai didi

scala - 设置 sbt 环境以一次破解多个库

转载 作者:行者123 更新时间:2023-12-04 11:26:57 25 4
gpt4 key购买 nike

sbt 中是否有与 Leiningen 的“结帐”功能等效的功能?

这是我想要完成的事情:

我有两个项目,一个应用程序和图书馆“酒吧”。我想独立发布这些项目中的每一个。 取决于 酒吧 ,并且每当第三方尝试构建“Foo”(这是典型行为)时,sbt 项目将指示 sbt 从存储库下载“ Bar ”的 jar。

现在,假设我想同时破解 酒吧 同时。例如,在处理 时富 ,我想直接编辑调试的部分源码酒吧 所以编辑会影响 (然后在方便的时候重建)。

如何指示 sbt 满足它对 的依赖?酒吧 在这次黑客 session 期间从我机器上的源代码(而不是我的本地存储库)?

(P.S. 我问了 similar question 的 Clojure/Leiningen。Leiningen 具有完成此任务的 "checkouts" 功能。我想知道 sbt 中是否有类似的东西......)

最佳答案

您可以通过项目引用声明从 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项目引用的 id 必须与 Bar 项目的实际 id 匹配,这可能类似于 e.g. 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目录,如果存在,则将其中的目录(应该是其他项目的符号链接(symbolic link))添加为项目的项目引用。它期望符号链接(symbolic link)被命名为链接项目的实际 ID(例如 default-edd2f8bar )。如果该目录不存在,则构建就像以前一样工作。

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

希望这可以帮助。

关于scala - 设置 sbt 环境以一次破解多个库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14351940/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com