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` 运行代码的构建函数,该函数计算项目的基数(basis)并进行一些基于该基数的操作,例如调用 `depstar`。所以动态上下文在这种情况下似乎应该是典型的。

这是针对 monorepo 项目,项目上下文因您在仓库中的操作而异。

我发现 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 在 tools.build 的上下文中使用 *project-root* 绑定,它的工作方式将不会与 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 调用的,它应该解析相对于 *project-root* 的路径(而不是)。
我在 https://github.com/seancorfield/depstar/issues/101 追踪这个问题 regarding depstar。
...