请分享您的想法,参加 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 跟踪这个合理认为是错误的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 设置它的目录上下文。

为什么在这个上下文中要使用底层库的目录控制?那个实际的用例是什么?

在工作环境中,我们有一个构建函数,该函数遍历项目,并在 `with-dir` 上下文中运行代码,计算项目的基座,然后使用该基座执行一些操作,例如调用 `depstar`。因此,动态上下文似乎在那里是惯例。

这适用于 monorepo,其中项目上下文根据你在 repo 中的操作而变化。

我发现 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 的内置函数不同。

我会反馈找到的结果和建议。
*project-root* 的动态绑定按预期工作(尽管我最初对 class-dir 和 uber-file“消失”到 projects/example 感到惊讶,直到我意识到出了什么问题)。

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

我必须仔细考虑这对于 depstar 的意义,因为它在内部计算基座(使用 t.d.a),这受到 with-dir 的影响,但 depstar 通常不会解析相对路径——但如果它在使用 tools.build 的上下文中调用,它应该解析相对路径(而不是)。
by
我在depstar的https://github.com/seancorfield/depstar/issues/101中跟踪这个问题。
...