在工作环境中,我们有一个构建函数,该函数遍历项目,并在 `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 的内置函数不同。
我会反馈找到的结果和建议。