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

欢迎!请查看关于页面以了解更多有关如何工作的信息。

0
编译器
已关闭

使用core/proxy为Java类生成代理会在生成的类文件中产生不可预测的方法顺序。
这对于可重复构建(当执行AOT时)来说是一个问题。

具体来说,我在Docker中运行Clojure,并希望我的应用程序镜像层尽可能小,接近Java开发者使用的(使用Meta-inf类路径和lib目录)。无论如何,为了让所有依赖项(包括作为AOT编译的一部分)在单独的一层,我需要每次运行构建时对我的应用程序依赖项代理的编译输出都是相同的。这减少了构建时间、镜像推送时间、镜像拉取时间和容器调度时间。

展示问题的代码示例(你需要运行几次以看到问题)。

https://github.com/kipz/predictable-proxies

原因:我已经追踪到这是由于在这里使用了一个未排序的映射

https://github.com/clojure/clojure/blob/master/src/clj/clojure/core_proxy.clj#L186

方法:使用按key的hash排序的映射(其中key是方法名、参数类型序列和返回类型的向量)。

补丁:CLJ-1973-v5.patch

审查人:Alex Miller

关闭时备注: 在1.11.0-beta1中发布

10 个答案

0

评论者:kipz

使用sorted-map的补丁

0

评论由:alexmiller 发布

我认为您可以遵循https://clojure.org/guides/comparators中的建议,为这个补丁编写一个更简单的比较器。

0

评论者:kipz

按要求编写了更简单的比较器。

0

评论由:alexmiller 发布

我想您丢失了有序集合。

0

评论者:kipz

分支间复制粘贴错误。这次已测试。

0

评论者:kipz

现在'let'具有更一致的格式化

0

评论由:alexmiller 发布

虽然这可能是可以的,但最好使用Clojure的'hash'函数而不是Java的hashCode函数。映射本身根据'hash'进行哈希,这似乎更合适。

0

评论者:kipz

按照要求,使用Clojure的'hash'。

感谢Alex - 还了解到布尔比较器!

0
by

评论由:alexmiller 发布

请注意,由于在这些版本之间没有哈希保证,这种排序可能会随着 Clojure 或 JVM 版本的变化而变化。目前先进行预筛选。

0
by
参考:[https://clojure.atlassian.net/browse/CLJ-1973](https://clojure.atlassian.net/browse/CLJ-1973)(由 kipz 报告)
...