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

欢迎!请查阅关于页面了解更多这个平台的信息。

+1
tools.build
重新标记

我正在开发一个依赖 tools.build 的库,并希望将其作为 jar 发布。虽然 tools.build 仅以 git dep 计算,但我无法将其包含在 pom 文件中的依赖项中。关于这个话题的更广泛讨论在此 Slack 线程 中进行,其中 @alexmiller 请求我在这里提出这个话题。

2 答案

+2
我不确定这真的是正确的问题?
是的,抱歉,抓错了网址。
0 投票

除了Alex使用工具.build构建的用例之外,还有其他原因可以让.jar文件变得有用。

精确重现也是考虑此方案的一个原因。如果有人想在美国开发用于航空电子设备的产品,他们需要遵守FAA的DO-178C... 我不是律师,但我的理解是,一个要求是能够在设备使用期间生成软件的二进制精确副本,这可能是在批准后的数年后。我不从事这类工作,但我做一些支持这样的人的工作。对clojuretools.build等工具的微小更改可能会影响生成的确切代码、执行的指令数量、分配的内存量等。在这种情况下,即使是微小的向后兼容性更改也不能容忍。其他领域如机器人或卫星也可能有类似的重现性要求,我相信美国不是唯一有这种法规的国家。

Maven坐标是一个更不可变的东西,它在时间上的记录更好,可以为您提供完全相同的工件。

确切的Git提交是可靠的(可能是大多数项目的最佳选项),但Git历史可以被修改或删除...Git“版本发布”的可变性还更大。它们可以被移动(例如,从GitHub到GitLab),也可以移动标签。如果您尝试考虑5年或10年后的未来,那时项目负责人可能已经改变过几次,这些想法会让人感到更恐慌。

Clojure在编译代码方面并不支持可重复构建,所以tools.build的JAR与此问题无关。如果需求是“二进制精确复制”,Clojure就不在考虑范围内。
这听起来不是从源代码的角度实现二进制精确可重复性,而是针对部署。一旦构建成Jar,它始终会是相同的(即使它只包含Clojure源代码)。

话虽如此,我很想知道,Clojure构建中哪一点从源代码来看不可重复?我知道JAR不可重复,因为文件上的元数据,如时间戳等,但这些都可被清除,Jar的内容仍可重复。
看起来已经完成了!感谢大家! https://search.maven.org/artifact/org.clojure/tools.build/0.8.4/jar

> 在编译代码方面,Clojure已经不支持可重复构建

我认为相同源代码应用特定的Clojure版本将始终生成相同的输出。(除非有人在编译任务中引入了时间/随机种子?)

> 我很想知道,Clojure构建中哪一点从源代码来看不可重复?

说实话,我也是。但话虽如此,如果我们有一个不可变的资产可以指向,我们就减少了引入非确定性的东西的范围。
...