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

欢迎!请参阅关于页面,了解更多关于这是如何工作的信息。

+1
tools.namespace

支持在刷新时跟踪非 Clojure 文件。这里的想法是让重新加载工作流程对像 HugSQL(可能依赖于项目中的非 Clojure 文件)这样的库来说运行良好。

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

6 答案

0

评论由:stuart.sierra 发布

我已经意识到这项功能的价值很长时间,但我预计这需要对 tools.namespace 使用的内部数据结构进行重大、破坏性的更改。

0
_评论由:rymndhng_ 发布

我已经思考了内部数据结构一段时间,我认为在不破坏内部数据结构的情况下进行跟踪可能是有可能的。洞察力在于,我们需要通过取 Clojure 源文件的修改时间戳及其任何外部依赖项的最大修改时间戳来确定“已修改”的 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 提出)
...