请分享您的想法,参加 2024 年 Clojure 状态调查!

欢迎!请参阅 关于 页面了解有关本站运行方式的更多信息。

0 投票
tools.namespace

最初作为 scan-all 函数的问题提交,当时我不知道 0.3.0 预览版已经弃用了该函数。我也对更新的 scan-dirs 进行了测试,它也有相同的问题。

当存在定义相同命名空间的 .clj 和 .cljc 文件时,tools.namespace scan-dirs 和 scan-all 使用 .cljc 文件的依赖项,而忽略 .clj 文件的依赖项,这对于 Clojure/Java 应该相反。

请在此处查看示例项目和其 README 文件以获取复现步骤:https://github.com/jafingerhut/tnstest

请注意,Clojure/Java 的行为是优先选择 .clj 文件而不是定义相同命名空间的 .cljc 文件,即使 .clj 文件在类路径中晚于 .cljc 文件所在目录。据 Alex Miller 发在 clojure-dev Google 组的电子邮件,这种行为是按设计实现的。链接: https://groups.google.com/d/msg/clojure-dev/d5Hb1E7zfHE/sPybIAxgCwAJ

4 个答案

0 投票

评论者:stuart.sierra

我确认这是一个错误。

在我添加了(链接:https://github.com/clojure/tools.namespace/commit/64e807c1888b494d04bb4dc96432d4d76aa0db54 文本:多个文件扩展名)时,我没有考虑到优先级顺序。

修复这个问题可能很棘手。

它从 {{c.t.n.find}} 开始。(链接:https://github.com/clojure/tools.namespace/blob/64e807c1888b494d04bb4dc96432d4d76aa0db54/src/main/clojure/clojure/tools/namespace/find.clj#L54 文本:c.t.n.find/find-sources-in-dir)通过文件扩展名(由 0.3 的 {{platform}} 参数控制)进行筛选,但它一次只考虑一个目录。由于文件可能位于两个不同的目录中,它不一定能发现具有相同名称但扩展名不同的两个文件。

下一层是 {{c.t.n.file}},当前它根本不考虑文件扩展名,但也许应该这么做。

在(链接:https://github.com/clojure/tools.namespace/blob/5d6957ddb11d74fb54c92d2edccce65e8621a3f7/src/main/clojure/clojure/tools/namespace/dir.clj#L22 文本:c.t.n.dir)中,我们有足够的信息来根据扩展名对同一命名空间的文件进行优先级排序和过滤。但是,为了正确执行,还需要处理更新。例如,如果一个项目中有一个{{.cljc}}文件,然后添加了一个 .clj 文件。{{c.t.n.dir}}应该将其视为从依赖图中删除{{.cljc}}文件。

我认为这需要存储命名空间名称与文件名之间的关联,这是我希望避免的。

0 投票

评论者:stuart.sierra

甚至可以将{{platform}}作为跟踪器的属性,以确保在添加更多文件时始终使用相同的规则。

0 投票

评论者:jafingerhut

我同意修复这个问题不是对工具命名空间的小改动,这就是为什么我没有提前提出补丁的原因。当我想到Eastwood应该如何处理 .cljc 文件时发现了这个问题。如果我想出什么方案,我会在这里添加任何提出的补丁。

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