请分享您的想法参与 2024 Clojure 状态调查!

欢迎!请参阅 关于页面 了解有关这个网站的工作方式的一些信息。

+2
tools.build

冲突处理程序在合并时将 data_readers.clj* 文件视为 EDN 时将其视为 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呢?
我在这发现了我的问题。在本地上,我依赖早期的tools.build版本在一个开发别名中,那是在修复该问题之前的8.3以前的版本。我以为我已经通过查看依赖树来检查这一点了,但我在某个地方把自己弄糊涂了,并且说服自己我没有。对此造成的混乱我感到抱歉。

1 个答案

+1

已被选中
...