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。

...