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上下文包装,它们的 Behavior 也不会正确。

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

这有点不直观(我花了很长时间才用depstar追踪到这个问题 -- 我认为这绝对是一个bug)。

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来设置其目录上下文。

为什么在这个上下文中会使用底层数据的目录控制呢?这样做的实际用例是什么?

by
在作品中,我们有一个遍历工程并运行 `with-dir` 上下文中代码的构建函数,该函数计算项目的基,然后使用该基进行操作,例如调用 `depstar`。因此,动态上下文在那里似乎应该是符合语法的。

这是针对一个单一仓库,其中项目上下文根据你在仓库中的操作而变化。

我发现 clojure.tools.build.api/*project-root* 是公共的和动态的,因此它可以与绑定一起使用。但是,查看 create-basis 的源代码,我在某种程度上惊讶它似乎尊重 t.d.a 的 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 的内置函数那样工作。

我会报告发现/建议。
by
*project-root* 的动态绑定按“预期”工作(尽管我最初很惊讶类目录和 uber-file “消失”到 projects/example 中,直到我意识到发生了什么)。

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

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