问题
tool.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
元数据的命名空间。