请在2024年Clojure状态调查!中分享您的看法。

欢迎!请参阅关于页面了解更多关于此功能的信息。

+1
tools.namespace

嘿,

在我们的组织中,我们使用Component,并希望开始使用重新加载工作流程来更轻松地重新加载代码。

我们面临的问题是我们开发类路径上内容太多。除了应用程序本身(通过(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中?

2 个答案

+1

我之前做过的一个相当相关的帖子: https://ask.clojure.org/index.php/10277/preventing-clojure-namespace-refresh-loading-namespaces

我非常希望看到将此功能整合到tools.namespace中。

...