在第一次调用时,它重新加载类路径上的所有 Clojure 文件。
纠正:它不会重新加载类路径上的任何命名空间。它仅限于目录(与包含在 .jar 文件中的 .clj 文件不同,这些文件也构成类路径的一部分)。
无论如何,当用户没有执行 set-refresh-dirs
时,这是它的行为。tools.namespace 无法最佳猜测 refresh-dirs
值应该是多少,因此最佳实践是在事先有意为之地设置它。
这体现在 Sierra 的 reloaded 模板中。
至少,这使得第一次刷新调用比必需的慢得多。
tools.namespace 旨在面向寻求自动化代码重新加载、面向项目的程序员。
它假定你想要 与项目一起工作(与任意脚本集相对),无法猜测哪个项目命名空间将首先需要,或者你将首先做什么(运行测试,启动服务器?)。因此,它加载每个命名空间。
值得注意的是,REPL 会话可以持续数天,甚至数周。如果出现问题,你可以 (clear)
并重新开始。
我在类路径上有些 Clojure 文件,需要一些不可用的依赖项。仅此一项就使得使用 refresh 成为不可能。
使用 set-refresh-dirs
时,此问题全部消失。
当然,这个解决方案假设每个文件都有一个合适的 ns 表单,并且不会创建其他命名空间。
这是一个好的假设,为每个位于 src、test 之下的 ns 做这件事。任意工具可能会在无法遵循这个事实上的标准时中止。
再次强调,这就是为什么存在 set-refresh-dirs
的原因——为了将 '主' 源路径(如 src/
、test/
)与包含示例、脚本、草案等内容的其他目录区分开来。实际上,在给定的项目中执行任意命名空间的 require
是危险的?(因为这些可以是面向生产的脚本等)。