在公司的项目中,我们有一个遍历项目并使用 `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 内置函数相同。
我将报告我找到的结果或建议。