欢迎!请参阅关于页面以了解更多关于此的工作方式的信息。
最初作为 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
评论人: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}} 文件。
我认为这将需要存储命名空间名称和文件名之间的关系,这是我希望能避免的。
甚至有可能将 {{platform}} 设为追踪器的属性,以确保在添加更多文件时始终使用相同的规则。
评论者:jafingerhut
同意修复这个问题不是对 tools.namespace 的小改动,因此我没有提前提出补丁。在思考 Eastwood 如何/应该处理 .cljc 文件时发现了这个问题。如果我想出什么,我会在这里添加任何提出的补丁。