如何解决Clojure:如何使Leiningen建造物具有可复制性? 简介示例问题
简介
如reproducible-builds.org所述,这是一种最佳实践,能够生成一个构建,当任何机器/操作系统上的任何人在任何时候都给予相同的源代码时,可以重新创建该构建。如何在Clojure / Leiningen环境中归档?
示例
使用雷宁根创建项目并构建.jar
文件的非常基本的示例用法:
lein new app hello
cd hello
lein uberjar
sha256sum target/uberjar/hello-0.1.0-SNAPSHOT-standalone.jar
这将输出一定的sha256哈希,其中包含.jar
文件内部的不确定性。如果您在不更改任何源文件的情况下立即重新运行构建,则校验和哈希将始终有所不同:
lein uberjar
sha256sum target/uberjar/hello-0.1.0-SNAPSHOT-standalone.jar
问题
如何创建.jar
文件,以便在再次运行时(例如在将来的某个地方,例如在其他Linux发行版上)再次运行时产生相同的校验和散列?
解决方法
Jar文件不是确定性的,但其内容是确定性的。试试
unzip -c hello-0.1.0-SNAPSHOT-standalone.jar | md5sum
,
有一个软件包可用于: strip-nondeterminism ,它也支持.jar
文件。它可以在debian和ubuntu(以及其他基于debian的发行版)中使用,但是您始终可以从源代码中使用它。
安装(debian / ubuntu / etc。):
sudo apt install strip-nondeterminism
内部版本:
lein uberjar
strip-nondeterminism -t jar target/uberjar/hello-0.1.0-SNAPSHOT-standalone.jar
sha256sum target/uberjar/hello-0.1.0-SNAPSHOT-standalone.jar
当构建多次运行时,这将输出相同的校验和哈希。它将所有文件时间戳重置为静态值。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。