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 之外还有其他内容呢?
我终于搞清楚了我的问题。在本地,我依赖于早期版本的 tools.build 作为 dev 别名,在该问题修复之前的 8.3 版本。我以为我已经通过查看依赖树来检查这一点,但我 confuse myself 了一些时候,并说服自己我没有。对此混乱表示歉意。

1 答案

+1

selected
上面的堆栈跟踪显示了v0.8.3代码的链接:
...