2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请查阅关于页面以获取有关该功能如何工作的更多信息。

+1 投票
tools.namespace

在刷新时支持跟踪非 Clojure 文件。这里的思想是确保重新加载工作流程对于像 HugSQL(可能依赖于项目中的非 Clojure 文件)这样的库也能很好地工作。

有关更多上下文,请参阅 https://github.com/layerware/hugsql/issues/72

6 个答案

0 投票

评论者:stuart.sierra

我已经认识到了这个功能的价值很长时间了,但是我认为它将需要对 tools.namespace 使用的内部数据结构进行重大和破坏性的更改。

0 投票
_评论者:rymndhng_

我思考了一段时间的内部数据结构,我认为可以在不破坏内部数据结构的情况下跟踪这个问题。洞见是我们需要通过取 clojure 源文件及其任何外部依赖的最大修改时间来确定 `modified` clojure 源文件。

这需要三处更改

1. 定义外部文件依赖关系的方法(可能作为命名空间的元数据)。示例


(ns my.testing.ns
  {:clojure.tools.namespace.files/filedeps #{"resources/foo1.properties"
                                             "resources/foo2.properties"})


2. 在追踪器中新增一个名为 {{::files/filedeps}} 的条目,它将源文件映射到其他文件上。

3. 更新 `modified-files` 断言以包含 `file-deps`,大致如下


(defn- modified? [tracker ^File file]
  (let [filedeps  (get-in tracker [::file/filedeps file])
        time (::time tracker 0)]
    (or (< time (.lastModified file))
        (< time (apply max (map #(.lastModified %) filedeps)))
        (not-every? #(.exists %) filedeps))))

(defn- modified-files [tracker files]
  (filter #(modified? tracker %) files))
0 投票

评论者:rymndhng

我尝试实现这个过程,希望听听您的看法。虽然文档需要一些工作来解释它是如何工作的。

0 投票

评论者:rymndhng

遵循Stuart的建议,我创建了一个分支,其中包含一些设置说明! https://github.com/rymndhng/tools.namespace

0 投票

评论者:[email protected]

我现在正在试用这个,看起来正好满足我的需求。唯一注意到的是,没有在 :reloading 消息中显示文件依赖项变更的迹象,它仅显示命名空间。不确定是否需要以及如何显示这个信息。

0 投票
参考: https://clojure.atlassian.net/browse/TNS-48(由 rymndhng 报告)
...