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

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

+1
tools.namespace

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

有关更多背景信息,请参阅https://github.com/layerware/hugsql/issues/72

6 个答案

0

评论者:stuart.sierra

我已经意识到这个特性的价值很久了,但我预计这将对 tools.namespace 使用的内部数据结构造成重大、破坏性的更改。

0
_评论者:rymndhng_

我思考了一段时间内部数据结构,我认为可能在不破坏内部数据结构的情况下跟踪此内容。洞察力在于,我们需要通过取 clojure 源文件的 max 修改时间及其所有外部依赖的最大修改时间来确定 `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 报告)
...