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

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

by
在工作中,我们有一个构建函数,它遍历项目并在 `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 内置函数相同。

我将提供发现和建议的反馈。
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* 解决。
by
我正在跟踪这个问题,有关 depstar 的信息请访问 https://github.com/seancorfield/depstar/issues/101
...