在首次调用时,它会重新加载 classpath 上的所有 Clojure 文件。
更正:它不会重新加载 classpath 上的任何 ns。它受限于目录(与包含在 .jar 文件中的 .clj 文件不同,它们也构成了 classpath 的一部分)。
无论如何,这是当用户未执行 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
实际上是危险的(因为这些可能是面向生产的脚本等等)。