欢迎!请查看关于页面以获取更多有关此如何工作的小信息。
最初作为函数 scan-all 的问题提交,我当时不知道 0.3.0 alphas 中已弃用。我还对不同版本的 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
评论由:stuart.sierra 提出
我可以确认这是一个错误。
当我在链接: https://github.com/clojure/tools.namespace/commit/64e807c1888b494d04bb4dc96432d4d76aa0db54 中添加 (text: 多个文件扩展名) 时,我没有考虑到优先级顺序。
修复这个问题可能很棘手。
它从 {{c.t.n.find}} 开始。链接: https://github.com/clojure/tools.namespace/blob/64e807c1888b494d04bb4dc96432d4d76aa0db54/src/main/clojure/clojure/tools/namespace/find.clj#L54 text: 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}} 文件。
我认为这需要存储命名空间名称和文件名称之间的关联,这正是我一直想避免的。
甚至可能有必要将 {{platform}} 设置为跟踪器的属性,以确保在添加更多文件时始终使用相同的规则。
发布的评论:jafingerhut
我同意修复这个问题对于 tools.namespace 来说不是一个小变动,这就是为什么我没有提前提出补丁的原因。我在思考 Eastwood 应该如何处理 .cljc 文件时遇到了这个问题。如果我想出什么,我会在这里添加任何提出的补丁。