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

欢迎!请在关于页面查看有关该页面如何工作的更多信息。

0
tools.namespace

最初作为一个针对scan-all函数的问题提交,我当时不知道这个函数在0.3.0 alpha版中已被弃用。我也针对新的scan-dirs进行了测试,它也有相同的问题。

当存在同时定义相同命名空间的.clj和.cljc文件时,tools.namespace的scan-dirs和scan-all可能会使用.cljc文件的依赖关系,而忽略.clj文件中的依赖关系,而对于Clojure/Java,则应执行相反的操作。

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

请注意,Clojure/Java的行为是优先于定义相同命名空间的.clj文件,即使该.clj文件在类路径中位于.cljc文件之后。根据Alex Miller在clojure-dev Google群组的电子邮件,此行为是按设计实现的。链接: https://groups.google.com/d/msg/clojure-dev/d5Hb1E7zfHE/sPybIAxgCwAJ

4 个答案

0

评论来自:stuart.sierra

我可以确认这是一个bug。

当我添加了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 文件的项目,.cljc 文件应该被视作从依赖图中 删除 的。

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

0

评论来自:stuart.sierra

甚至将 {{platform}} 变成一个跟踪器的属性可能也合理,以确保在添加更多文件时总是使用同样的规则。

0

评论者:jafingerhut

我同意修复这个问题的不是对 tools.namespace 的一个小改变,这就是我还没有提供补丁的原因。我是在思考Eastwood应该如何处理 .cljc 文件时遇到这个问题的。如果我想到什么,我会在这里添加任何建议的补丁。

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