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