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之前修复的版本。我本以为我已经通过查看deps树来检查这个,但我可能在某个地方搞混了,并说服自己我并没有这样做。对于这里的混乱我表示歉意

1 答案

+1 投票

选择
...