问题
tools.namespace
的v1.4.0版本返回了命名空间声明的元数据。新版本不再返回。
复现步骤
给定./src/foo.clj
(ns ^{:doc "foo" :no-doc true} foo)
和./test.clj
(require '[clojure.tools.namespace.find :as f]
'[clojure.java.io :as io])
(binding [*print-meta* true]
(pr (f/find-ns-decls-in-dir (io/file "src"))))
如果使用v1.4.0,我将获得foo
命名空间的:doc
和:no-doc
元数据
❯ clj -Sdeps '{:deps {org.clojure/tools.namespace {:mvn/version "1.4.0"}}}' -M test.clj
((ns ^{:doc "foo", :no-doc true} foo))
但使用v1.4.4时,命名空间元数据包括来自tools.namespace的新生成的:dir
和:file
元数据,但不包括:doc
和:no-doc
元数据
❯ clj -Sdeps '{:deps {org.clojure/tools.namespace {:mvn/version "1.4.4"}}}' -M test.clj
((ns ^{:dir "src", :file "foo.clj"} foo))
这自v1.4.1版本以来一直如此,该版本引入了jar/dir和文件元数据功能
❯ clj -Sdeps '{:deps {org.clojure/tools.namespace {:mvn/version "1.4.1"}}}' -M test.clj
((ns ^{:dir "src", :file "foo.clj"} foo))
附加信息
同样的问题应该会在find-ns-decls-in-jarfile
中体现。
使用场景
Cljdoc在尝试加载之前使用tools.namespace来了解命名空间。它会跳过具有:no-doc
和/或:skip-wiki
元数据的命名空间。