在第一次调用时,它会重新加载类路径上的所有 Clojure 文件。
纠正:它不会重新加载类路径上的任何 ns。它仅限于目录(例如,在 jar 文件中的 .clj 文件,这也形成类路径的一部分)。
总之,当用户未执行 set-refresh-dirs
操作时,这是它的行为。tools.namespace 无法最佳猜测 refresh-dirs
值应该是什么,因此最佳实践是自己有意地在事先设置它。
这在 Sierra 的 reloaded 模板中有所体现。
这至少使得第一次刷新调用比需要的慢得多。
tools.namespace 致力于为寻求自动代码重载、以项目为导向的工作流程的开发人员提供帮助。
它假定您想要 与项目一起工作(与一系列任意的脚本相反),无法猜测哪个项目命名空间将首先需要,或者您会先做什么(运行测试、启动服务器?)。因此,它会加载每个命名空间。
值得注意的是,REPL 会话可以持续几天,甚至几周。如果出现问题,您可以使用 (clear)
并重新开始。
我在类路径上有一些 Clojure 文件,它们需要无法提供的依赖。仅这一点就使得使用 refresh 变得不可能。
使用 set-refresh-dirs
时,这个问题完全解决了。
当然,这种方法假设每个文件都有正确的 ns 表达式,并且不会创建其他命名空间。
这是一个很好的假设,因为位于 src、test 下的每个命名空间都是如此。任意工具可能会在无法遵循这一事实标准的命名空间上崩溃。
再次强调,这就是为什么存在 set-refresh-dirs
,用于区分 '主' 源路径(src/
、test/
)和其他包含示例、脚本、草案等目录。实际上,在给定项目中以任意命名空间执行 require
是非常危险的(因为这些可能是面向生产的脚本等)。