0

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 表单。原因很清楚。但这确实打乱了我的工作流程,因为对已加载文件的更改显然不会重新加载命名空间。

有谁知道是否有一个库可以处理显式加载的源文件?如果没有什么我会一起破解一些东西(可能通过在负载周围编写一些丑陋的宏)并使其公开可用。

4

1 回答 1

0

好的,回答我的问题……我已经扩展了 ns-tracker 并提交了一个拉取请求。它没有我预期的那么老套,实际上是合理的。

我的叉子在:https ://github.com/hutch/ns-tracker

包含对 ns-tracker 的许多更改。具体到我的问题,它支持以 clojure/core 使用的方式使用 load/in-ns。

您可以通过使用 leiningen 'checkouts' 机制在您的项目中使用这个 fork。

于 2012-12-28T19:40:49.983 回答