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

欢迎!请查看关于页面以获得更多有关此信息的工作方式的信息。

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

方法:使用排序映射,按键的哈希排序(键是一个方法名、参数类型的序列和返回类型组成的向量)。

补丁: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

评论者:alexmiller

请注意,这种排序可能在 Clojure 或 JVM 版本之间发生变化,因为这些版本没有跨版本哈希的保证。目前先进行预筛选。

0
...