如果你有一个包含 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 的初始/默认假设已经不再有效。
注:这也可能与此 问题 有关。