欢迎!请参阅 关于 页面以了解更多关于该功能的信息。
最初作为 function 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-dev Google 群组中 Alex Miller 的电子邮件,Clojure/Java 的行为是优先选择 .clj 文件,而不是定义相同命名空间的 .cljc 文件,即使 .clj 文件位于类路径中比 .cljc 文件更晚的目录中。链接: 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
同意修复此问题不是工具命名空间的微小更改,因此我还没有提出补丁。我在思考 Eastwood 如何/应处理 .cljc 文件时遇到了这个问题。如果我想出了什么,我会在这里添加任何提出的补丁。