在作品中,我们有一个遍历工程并运行 `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 的内置函数那样工作。
我会报告发现/建议。