9个版本
0.3.6 | 2024年7月30日 |
---|---|
0.3.5 | 2024年7月19日 |
0.3.2 | 2024年6月28日 |
0.2.0 | 2024年4月3日 |
0.1.0 | 2024年3月23日 |
#255 在 文件系统
273 每月下载量
4.5MB
2K SLoC
包含 (归档库, 340KB) libHSbase-compat-batteries-0.12.3-EvvecFThiaEAGWq5U5Tpi9.a.fixed, (静态库, 340KB) libHSbase-compat-batteries-0.12.3-EvvecFThiaEAGWq5U5Tpi9.a, (静态库, 1KB) tests/cases/libempty.a, (静态库, 2KB) tests/cases/testrelro.a, (静态库, 2KB) tests/cases/testrelro.fixed.a
构建后处理器,用于重置元数据字段以实现构建可重复性
此crate提供了程序add-determinism
,它接受一个或多个路径作为参数,并将递归处理这些路径,尝试在匹配扩展名的任何文件上运行处理器。(每个参数可以是单个文件或要递归处理的目录。)
对于每个处理的文件,都会打开一个临时文件,重写内容,将修改时间戳从原始文件复制到临时副本,并重命名副本以覆盖原始文件。
如果处理失败,会发出警告,但不会进行修改,程序返回成功。
此工具的目的是消除构建中常见的非确定性来源,使创建可重复(包)构建更容易。
用法
独立
$ add-determinism /path/to/file /path/to/directory
请注意,程序在原地工作,用重写的版本(如果有任何修改)替换输入文件。
一些有用的选项
-v
— 启用调试输出-j [N]
— 使用N
个工作者(如果没有提供N
,则使用与CPU一样多的工作者)--handler list|HANDLER|-HANDLER
— 约束处理器列表。接受逗号分隔的名称列表,可以是“正”名称列表,在这种情况下,只有列出的处理器将被使用,或者是一个“负”名称列表,每个名称前缀为减号,在这种情况下,列出的处理器将不被使用。默认情况下,无法初始化的处理器会跳过并发出警告。如果提供了“正”列表,初始化处理器失败将导致错误。可以使用特殊值list
列出已知处理器。--brp
— 启用“构建根程序”模式,详见下文。
在 rpm 构建环境中
当使用 --brp
调用时,必须定义环境变量 $RPM_BUILD_ROOT
并确保它不为空。所有参数都必须在 $RPM_BUILD_ROOT
之下。此选项旨在用于定义安装后步骤的 rpm 宏。请参阅 redhat-rpm-config pull request #293 了解添加了 add-determinism
调用的请求。
验证而非修改
当使用 --check
调用时,该工具处理所有文件,但实际上不会保存任何修改。相反,如果任何文件将被修改,它将失败。如果无法读取任何文件,它也会返回错误。
处理器
ar
接受 *.a
。
将嵌入的修改时间重置为 $SOURCE_DATE_EPOCH
,并将所有者:组设置为 0:0。
jar
接受 *.jar
。
使用 zip
包重写 zip 文件。存档条目的修改时间被钳定到 $SOURCE_DATE_EPOCH
。移除了额外的元数据,即主要是 UNIX 格式的时间和 DOS 权限(也因为包不支持这些)。
javadoc
接受 *.html
。
检查 HTML 文件的 <head>
部分,并找到 Javadoc 插入的标准行,这些行指定了文件的创建日期。例如,<!-- 由 javadoc 生成 (<version>) 在 <date> -->
将被替换为一个不带版本和日期的版本,而 <meta name="dc.created" content="<date>">
将被替换为一个包含 $SOURCE_DATE_EPOCH
的版本。
pyc
接受 *.pyc
。
此处理程序实现了 Python 字节码文件的 .pyc
文件解析器,并清理了未使用的“标志引用”。它是 MarshalParser Python 模块的 Rust 重实现。
pyc-zero-mtime
接受 *.pyc
。
此处理程序将 .pyc
文件头部的内部时间戳设置为 0,并将对应的源 .py
文件的 mtime 设置为 0。这旨在用于丢弃 mtimes 的 OSTree 系统,导致 .pyc
文件中嵌入的时间戳与 .py
文件的文件系统元数据不匹配。
默认情况下,此处理程序未启用,必须通过 --handler pyc-zero-mtime
明确请求。
注意事项
该项目灵感来源于 strip-nondeterminism,但完全使用 Rust 编写。对于 Debian,构建工具是用 Perl 编写的,更多 Perl 不是一个问题。但在 Fedora/RHEL/… 中,工具是用 Bash、Python 编写的或编译的,我们不希望在所有构建根中引入 Perl。此外,我们想要进行的处理细节也不同。例如,Debian 不分发 Python 字节码文件。
依赖项
~11–21MB
~295K SLoC