2024 Clojure 状态调查! 中分享你的想法。

欢迎!请参阅 关于 页以了解此平台的更多信息。

0
tools.namespace
编辑

如果你有一个包含 git 依赖的 deps.edn 项目,其中项目也使用了 clojure.tools.namespace.repl/refresh,那么默认情况下,refresh 调用将加载和刷新你的 git 依赖中所有的 Clojure 命名空间。

我认为它这么做是因为在 tools.deps 之前,所有的库依赖基本上都是以 jar 格式分发的,所以它会假设类路径中的任何目录都包含你的项目源代码,并且可以通过刷新来获益。

当在 tools.deps 项目中时,这一假设会发生改变,因为依赖现在可以存储在 ~/.gitlibs 目录上的文件系统中。这些依赖实际上被错误地认为是一个项目的依赖,并且会全部加载和刷新,即使你的项目实际上并没有调用 require

考虑到 ~/.gitlibs 是有版本的并且被设计为不可变的,因此自动汇总和刷新它们是没有意义的。

通过包含一个调用来显式设置你的项目的刷新目录,比如: (tnsrepl/set-refresh-dirs "src" "test"),可以很容易地避免这种情况,但我 wonder 如果 tools.namespace 默认排除 ~/.gitlibs 下的所有内容会更好,因为 tools.namespace 的初始/默认假设已经不再有效。

注:这也可能与此 问题 有关。

2 个答案

0

我认为在 tools.namespace 的背景下,将 ~/.gitlibs 作特殊处理并不合理。它实际上是更一般问题的具体实例——确定被考虑为“项目”的类路径子集。我对这里的原始意图了解不够,无法确定这是 tns 设计的问题,还是文档问题,或者是一些附加问题。

0

提前设置 set-refresh-dirs 是一个好主意。例如,面向生产的脚本、草稿代码等——它们通常不安全地未经检查地 require(这就是 (refresh) 在未配置时所做的)。

...