Ring 带有中间件“重新加载”(https://github.com/ring-clojure/ring/blob/master/ring-devel/src/ring/middleware/reload.clj)。它基于 ns-tracker (https://github.com/weavejester/ns-tracker)。ns-tracker 在源目录中查找可能以 ns 形式开头的源文件。它根据这些 ns 表单中包含的信息构建依赖关系图。这当然可以完美地工作,但仅适用于 ns 表单中明确包含的依赖项。
Clojure 中有一个习惯用法,命名空间被分成几个文件。有一个定义命名空间的源文件(使用 ns 形式)。该文件可以包含任意数量的顶级表单,但特别是将包括负载,通常在顶级但我认为不一定。加载的文件以 in-ns 形式开始。这并不像您想象的那样晦涩难懂……clojure.core 使用它。
这些加载文件的内容本身并不构成模块,也不一定被强制成为模块(循环依赖等)。
ns-tracker 不扫描源文件以查找负载表达式,也不查找 in-ns 表单。原因很清楚。但这确实打乱了我的工作流程,因为对已加载文件的更改显然不会重新加载命名空间。
有谁知道是否有一个库可以处理显式加载的源文件?如果没有什么我会一起破解一些东西(可能通过在负载周围编写一些丑陋的宏)并使其公开可用。