重新加载处理显式加载的源文件的中间件

时间:2012-12-24 16:59:26

标签: clojure compojure ring

Ring带有中间件'reload'(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表单。原因很清楚。但是它真的会弄乱我的工作流程,因为加载文件的更改显然不会重新加载命名空间。

有没有人知道是否存在处理明确加载的源文件的库?如果没有什么我会一起破解某些东西(可能是通过在加载时编写一些丑陋的宏)并将其公之于众。

1 个答案:

答案 0 :(得分:0)

好的,回答我的问题......我已经扩展了ns-tracker并提交了拉取请求。这不像我预期的那么糟糕,实际上是合理合理的。

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

包含的ns-tracker有很多变化。特别是对我的问题,它支持以clojure / core使用的方式使用load / in-ns。

您可以使用leiningen'checkouts'机制在项目中使用此fork。