2024 Clojure 状态调查! 中分享您的想法。

欢迎!有关本工作的更多详细信息,请参阅 关于 页面。

+1
tools.build

我在 depstar 中遇到了这个问题,但观察到 tools.build 也有同样的可能不正确的行为。

请参阅 https://github.com/seancorfield/with-dir-repro

如果您使用 tools.deps.alphawith-dir 包装 (b/create-basis ..),它将从 with-dir 位置处的 deps.edn 文件中计算出基础。

然而,如果您使用这个基础与 tools.build 函数,它们的行为就不正确 -- 即使它们也被相同的 with-dir 上下文包装。

依赖项来自项目的 deps.edn 文件(在这个例子中是 Clojure 1.9.0),但使用的 src 是从仓库的根目录开始的,而不是从项目文件夹开始的。

这让人难以理解(我花了很长时间使用 depstar 找到这个问题 -- 我确实认为这是一个错误)。

1 答案

+1

选定答案
 
最佳答案

tools.build 位于 tools.deps.alpha 之上。如果您正在使用 tools.build,您应该通过 https://clojure.github.io/tools.build/clojure.tools.build.api.html#var-set-project-root.21 设置其目录上下文。

为什么在 这种情况下要使用底层库的目录控制?这个用例的实际目的是什么?

在工作场所,我们有一个遍历项目并运行`with-dir`上下文中的代码的构建函数,计算项目的基础并随后对该基础进行操作,比如调用`depstar`。所以动态上下文在这里似乎是符合语法的。

这是针对单一仓库结构(monorepo),项目上下文根据你在仓库中操作的内容而变化。

我发现clojure.tools.build.api/*project-root*是公开的并且是动态的,所以可以用绑定来使用它。但是查看`create-basis`的实现源代码时,我有些惊讶它似乎可以尊重`with-dir`的上下文,因为它内部已经使用了。啊,`with-dir`依赖于`canonicalize`的行为,如果文件是相对的,它会预先附加当前*the-dir*的值,否则它会保留文件路径不变。所以,在"."的`with-dir`上下文中调用tools.build的`create-basis`会使用这个现有上下文。

我将更新我的重复示例以包含*project-root*的动态绑定,但是最初我选择使用`with-dir`的原因是因为depstar基于`t.d.a`构建,它以此方式创建了正确的基础——即使depstar随后无法正确解析相对于该上下文的相对文件路径。

但这也意味着,如果depstar在具有*project-root*绑定的tools.build上下文中使用,它的工作方式不会与tools.build的内置函数相同。

我会反馈我的发现和建议。
*project-root*的动态绑定工作“如预期那样”(尽管我最初很惊讶类目录和uber文件“消失”在projects/example中,直到我意识到发生了什么)。

我测试了`with-dir`和绑定*project-root*的一些组合,当*project-root*是相对路径时,它们的运行并不好(除了"。"这个原因之外,这就是为什么当我尝试使用`with-dir`时没有最初失败的原因)。

我将仔细思考这对depstar的影响,因为depstar在内部计算基础(使用t.d.a),并受到`with-dir`的影响,但depstar通常不解析相对路径——但如果它在tools.build的上下文中调用,它应该解析相对于*project-root*的路径(而不是相对路径)。
by
...