请在 2024年Clojure状态调查! 分享您的看法。

欢迎!请参阅 关于 页面了解有关此信息的更多信息。

+1投票
tools.build
重新标记

我正在开发一个依赖 tools.build 的库,并希望将其作为 jar 文件发布。由于 tools.build 仅作为 git 依赖项提供,我无法将其作为依赖项包含在我的 pom 文件中。关于这个主题的更广泛讨论在此 slack 主题 中进行了,在那里 @alexmiller 要求我将此问题在这里提出。

2个答案

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

除了在 tools.build 之上构建的 Alex 的用例之外,还有其他原因说明 .jar 文件可能很有用。

完全可重现性是考虑这一点的原因之一。如果有人想在北美使用应用于航空电子设备的产品,他们将需要符合 FAA 的 DO-178C 标准... 我不是律师,但我的理解是其中一个要求是能够生产在设备使用寿命期内部署的软件的二进制精确复制品,这些复制品可能在他们批准后的几年内出现。我并不从事这类工作,但我做的是支持这样的人工作的事情。对如 clojuretools.build 这样的工具的微小修改可能会对生成的/执行的精确代码有影响,对执行多少条指令、分配多少内存等产生影响。在这种情况下,即使是向后兼容的微小更改也不能容忍。其他领域如机器人或卫星可能也有类似的可重现性要求,我怀疑美国并非唯一有这类法规的国家。

Maven 坐标是一个更为永恒的东西,并且随着时间的推移有着更好的记录,可以精确地获得相同的工件。

精确的 Git 提交是可靠的(可能是大多数项目的最佳选项),但 Git 历史可能会被修改或删除... Git "发布"甚至更具可变性和可移植性。它们可以被移动(例如,从 GitHub 移动到 GitLab),标签也可以被移动。如果你在考虑未来五年或十年,这些想法可能更为令人担忧,到那时项目维护者可能已经变动过一两次了。

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 构建从源头不可重复的原因是什么?

老实说,我也是。但是,所有这些都说了,如果我们有一个不可变的资产可以指向,我们已经减少了可能引起非确定性的东西的数量。
...