在第一次调用时,它会重新加载classpath上的所有Clojure文件。
纠正:它不会重新加载classpath上的任何ns。它仅限于目录(与包含在.jar文件中的.clj文件,它们也构成classpath的一部分相反)。
无论如何,这是当用户没有执行set-refresh-dirs
时的行为。tools.namespace无法做出关于`refresh-dirs`值的最优猜测,因此最佳做法是在事先有意预设它。
这在Sierra的reloaded模板中得到了体现。
至少,它使得第一次刷新调用比所需的慢得多。
tools.namespace针对寻求自动化代码重新加载、以项目为导向的工作流程的程序员。
它假设您希望与您的项目一起工作(而不是与任意一组脚本),无法猜测哪个项目命名空间将是第一个必要的,或者您将首先做什么(运行测试,启动服务器?)。因此,它会加载每一个命名空间。
值得注意的是,REPL会话可以持续几天,甚至几周。如果出现问题,您可以使用(clear)
并重新开始。
我在classpath上有一些Clojure文件,需要不可用的依赖。这本身就让使用refresh变得不可能。
当使用set-refresh-dirs
时,这个问题完全消失了。
当然,此解决方案假设每个文件都有一个合适的ns形式,并且不会创建其他命名空间。
这假设是对src、test下每个存在的命名空间都进行的良好假设。任意的工具可能在无法遵循这一既定标准的命名空间上崩溃。
再次强调,这是因为存在set-refresh-dirs
,以便区分主源路径(src/
、test/
)和其他包含示例、脚本、草案等的目录。在项目中的任意命名空间上执行require
实际上是非常危险的(因为那些可能是面向生产的脚本等)。