在工作中,我们有一个构建函数,它遍历项目并在 `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 内置函数相同。
我将提供发现和建议的反馈。