嘿,
在我们组织,我们使用Component,并希望开始使用reloaded工作流程,更方便地重新加载代码。
我们面临的问题是我们的开发类路径包含太多内容。除了应用程序本身(通过(require 'our-org.repl)
加载)之外,还有测试和一些一次性代码:迁移和作为文档保留的说明性REPL会话。
这些辅助命名空间中的一些名称与其在文件系统中的位置不匹配,因此它们无法被tools.namespace正确加载。我们希望完全防止它们被重新加载,尽管它们存在于类路径上。
我们可以使用clojure.tools.namespace.repl/set-refresh-dirs
,但我认为这很笨拙(需要显式地选择目录)并且表达力不够。我们真正想要的只是重新加载(可能间接的)our-org.repl
的命名空间。
为此,我对tools-namespace进行了猴子补丁
(defn relevant-deps [deps ns]
(conj
(ns.dependency/transitive-dependencies deps ns)
ns))
(alter-var-root
#'ns.repl/remove-disabled
(fn [orig-impl]
(fn [{:keys [::ns.track/deps] :as tracker}]
(-> tracker
(orig-impl)
(update ::ns.track/unload (partial filter (loaded-libs)))
(update ::ns.track/load
#(set/intersection (set %1) %2)
(relevant-deps deps 'our-org.repl))))))
这用了,但显然很笨拙。有没有更好的方法实现相同的目标?也许可以将限制依赖的功能添加到tools.namespace中?