2024 年 Clojure 状态调查! 中分享您的想法。

欢迎!请参阅 关于 页面获取更多有关如何使用本网站的信息。

+2
tools.build

data_readers.clj* 的冲突处理器在读取文件以合并时将其视为 EDN。对于包含读取条件的 .cljc 文件,这将失败。

RuntimeException No dispatch macro for: ?
	clojure.lang.Util.runtimeException (Util.java:221)
	clojure.lang.EdnReader$DispatchReader.invoke (EdnReader.java:552)
	clojure.lang.EdnReader.readDelimitedList (EdnReader.java:757)
	clojure.lang.EdnReader$MapReader.invoke (EdnReader.java:680)
	clojure.lang.EdnReader.read (EdnReader.java:145)
	clojure.lang.EdnReader.read (EdnReader.java:111)
	clojure.lang.EdnReader.readString (EdnReader.java:67)
	clojure.edn/read-string (edn.clj:46)
	clojure.edn/read-string (edn.clj:37)
	clojure.edn/read-string (edn.clj:37)
	clojure.tools.build.tasks.uber/conflict-data-readers (uber.clj:89)
	clojure.tools.build.tasks.uber/conflict-data-readers (uber.clj:86)
因为这个冲突处理器实际上应该在合并的输出中保留条件。
实际上并不复杂,因为读取器有对 :read-cond :preserve 的支持。
感谢Sean在我提到slack之后在这里提出这个问题。

我后来意识到,这好像是在我依赖aws-api和tick时发生的,并且仅当我从REPL调用uber函数时。当我从命令行使用`clj -T:build build`时,它不会出现。

以下是错误的最小版重现
https://gist.github.com/jjttjj/1b3cac66deb6ece27cb05d1f1f493245
当前合并的实现方式很有趣。抛开当前的 repl-only 问题,对于 data_readers.cljc 中只有值是条件性的内容来说,功能运行良好,例如

{foo/bar #?(:clj xxx :cljs yyy)}

但对于这个(这是有效内容)则不行

#?(:clj {foo/bar clojure.core/identity})

我并不是说上面的风格很好。

我曾以为它不会保留,而是读取 :clj 分支。为什么你还想在你的 uberjar 中放任何不是 :clj 的东西呢?
我在这里搞清楚了问题。在本地,我依赖于在 dev 别名中使用 tools.build 的早期版本,这个版本在 8.3 之前被修复。我以为我已经通过查看依赖树来检查这个了,但我在某个地方搞混了自己,并让自己确信我没有。为这里的混乱表示歉意。

1答案

+1

选择
...