请在 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中,你为什么要选择 :(cljs) 而不选择 :clj呢?
我解决了这里的问题。在本地,我依赖了一个较早版本的 tools.build 在一个开发别名中,这是在 8.3 版本之前,那个问题已经被修复了。我以为我已经通过查看依赖树来检查这个,但我最终还是搞混了,并使自己相信我并没有。对于这里的困惑,我深感抱歉。

1 答案

+1

选择
...