在工作场所,我们有一个遍历项目并运行`with-dir`上下文中的代码的构建函数,计算项目的基础并随后对该基础进行操作,比如调用`depstar`。所以动态上下文在这里似乎是符合语法的。
这是针对单一仓库结构(monorepo),项目上下文根据你在仓库中操作的内容而变化。
我发现clojure.tools.build.api/*project-root*是公开的并且是动态的,所以可以用绑定来使用它。但是查看`create-basis`的实现源代码时,我有些惊讶它似乎可以尊重`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的内置函数相同。
我会反馈我的发现和建议。