使用 RPM 打包 Miller(mlr):从 spec 文件到源 RPM 与二进制 RPM 的完整指南

发布时间:2026/9/24 15:32:46
使用 RPM 打包 Miller(mlr):从 spec 文件到源 RPM 与二进制 RPM 的完整指南 CLI数据分析【免费下载链接】millerMiller is like awk, sed, cut, join, and sort for name-indexed data such as CSV, TSV, and tabular JSON项目地址https://gitcode.com/gh_mirrors/mi/miller点击查看免费下载导读Miller命令行工具为mlr是一款面向 CSV、TSV、JSON 等名称索引数据的处理工具官方安装方式包括包管理器、预编译二进制与源码编译。而在 RHEL/CentOS/Fedora 等基于 RPM 的发行版上用户常希望以原生 RPM 形式分发与安装 Miller。本文基于仓库根目录的 README-RPM.md 官方文档完整讲解如何从源码构建 Miller 的源 RPMSRPM与二进制 RPM包括一次性环境准备、spec 文件解读、rpmlint校验、rpmbuild -bs/rpmbuild -ba的构建流程以及安装后的版本与 man 手册验证。读完本文你将具备在 RPM 系 Linux 上独立完成 Miller 打包、校验、安装的全套实操能力。一、Miller 的 RPM 打包总览Miller 仓库在根目录提供了两个与 RPM 打包直接相关的关键文件miller.specRPM 构建描述文件定义了软件包的元数据、构建依赖、构建/检查/安装阶段以及要打入包内的文件清单README-RPM.md打包操作手册按读者对 RPM 的熟悉程度分成经验者与无经验者两套指引。整套流程的核心思路是用发布 tarballmiller-版本.tar.gz作为 RPM 的 Source 输入用miller.spec描述如何把它构建成可安装的 RPM。官方发布流程中源 RPMSRPM是每次发布必须产出的工件之一详见 docs/src/how-to-release.md这进一步说明 SRPM 构建是被官方支持的标准化流程。1.1 miller.spec 核心结构解读当前仓库中的 miller.spec 以6.21.0为示例版本关键字段如下Summary: Name-indexed data processing tool Name: miller Version: 6.21.0 Release: 1%{?dist} License: BSD Source: https://github.com/johnkerl/miller/releases/download/%{version}/miller-%{version}.tar.gz URL: https://miller.readthedocs.io # gcc for cgo transitive dependency BuildRequires: golang BuildRequires: gcc BuildRequires: systemd-rpm-macros各字段含义与注意事项Name: miller软件包名。虽然二进制名为mlr但 RPM 包名统一使用millerrpm -qpi输出中的 Name 字段显示为mlr属于旧版本 spec 的历史差异当前版本统一为millerVersion: 6.21.0版本号需与发布 tarball 的版本号一致构建前按需修改Release: 1%{?dist}发布号%{?dist}会自动带上发行版标签如.el6、.fc40这也是文档示例中出现miller-6.2.0-1.el6这类文件名的原因Source指向发布 tarball 的 URL用%{version}宏自动拼接版本号因此只要Version字段正确Source 无需手工修改BuildRequires: golang、gccMiller 是 Go 项目且依赖 cgo注释中明确说明 gcc 是 cgo 的传递依赖因此构建机必须安装 Go 工具链与 C 编译器%description包描述概括了 Miller 的核心能力对 CSV/JSON 等名称索引数据提供类似 sed/awk/cut/join/sort 的功能支持格式互转、保留表头、流式处理低内存占用、适配管道与tail -f。构建阶段与根目录 Makefile 中的目标一一对应%prep %autosetup %build make build %check make check %install make install%prep中的%autosetup自动解包 Source tarball 并进入源码目录%build调用make build对应 Makefile 中的go build github.com/johnkerl/miller/v6/cmd/mlr产物为./mlr可执行文件%check调用make check对应 Makefile 中的unit-test regression-test即在打包过程中运行 Go 单元测试与回归测试确保构建出的版本通过测试%install调用make installMakefile 中该目标使用DESTDIR支持打包场景mkdir -p $(DESTDIR)/$(INSTALLDIR)后拷贝mlr并make -C man install安装 man 手册。最终打入 RPM 的文件清单%files %license LICENSE.txt %doc README.md %{_bindir}/mlr %{_mandir}/man1/mlr.1*即许可证文件、README 文档、二进制mlr以及 man 手册页由 man/Makefile 负责生成并安装到share/man/man1下的mlr.1。这也是二进制 RPM 中最终能看到/usr/bin/mlr与/usr/share/man/man1/mlr.1.gz两个文件的原因。二、一次性环境准备2.1 安装 rpmbuild 工具链RPM 系发行版通常不预装rpmbuild。文档给出的安装方式RHEL/CentOS 系使用 yumsudo yum install rpmbuild部分发行版的软件包名可能为rpm-build在tools/release.sh的报错信息中也提示install rpm-build若yum install rpmbuild找不到软件包可尝试sudo yum install rpm-build。现代 Fedora 上rpmbuild一般随rpm-build或rpm-devel提供。2.2 创建 rpmbuild 目录结构rpmbuild遵循标准目录布局约定需要手工创建以用户主目录为例cd mkdir ~/rpmbuild mkdir ~/rpmbuild/SPECS mkdir ~/rpmbuild/SOURCES~/rpmbuild/SPECS存放.spec文件~/rpmbuild/SOURCES存放 Source 归档tarball构建产物会自动落到~/rpmbuild/SRPMS源 RPM与~/rpmbuild/RPMS/arch二进制 RPM无需预先创建。2.3 准备 spec 文件与源码 tarballcp /your/path/to/miller/clone/miller.spec ~/rpmbuild/SPECS cp /your/path/to/miller-6.2.0.tar.gz ~/rpmbuild/SOURCES cd ~/rpmbuild/SPECS即把仓库根目录的 miller.spec 拷入SPECS把对应版本的发布 tarball 拷入SOURCES。tarball 的命名必须严格匹配 spec 中Source宏展开的结果miller-版本号.tar.gz。关于 tarball 的来源发布 tarball 由仓库根目录的 create-release-tarball 脚本生成通过make release_tarball触发它会先用./mlr --bare-version读取版本号然后使用支持--transform的 tar 打包源码并排除data、docs、experiments、perf、python、vim等非安装必需目录以减小体积。换句话说RPM 构建所用的 tarball 与官方发布流程产出的 tarball 是同一份你也可以直接使用官方发布页面提供的 tarball。三、修改版本号打包前的关键一步RPM 构建前请确认miller.spec的Version字段与你手中的 tarball 版本一致。文档以6.2.0为例Version: 6.2.0发布打包示例中 Source 对应的 tarball 为miller-6.2.0.tar.gz。由于 spec 使用%{version}宏自动拼接 Source URL只需把Version改为目标版本即可无需改动Source行。需要同步修改版本号的地方还有两处来自官方发布流程见 docs/src/how-to-release.mdpkg/version/version.go 中的STRING变量当前仓库为6.21.0-dev它决定mlr --version的输出miller.spec 的Version字段及其%changelog区块需要新增一条格式为* 星期 月 日 年 作者 - 版本-1的变更记录。如果版本号不匹配构建出的 RPM 可能无法正确关联到对应源码安装后mlr --version的输出版本也可能与预期不符。四、spec 文件校验rpmlint如果修改过 miller.spec官方建议在正式构建前用rpmlint做静态检查rpmlint miller.specrpmlint会检查 spec 的语法、宏使用、文件清单、许可字段等常见问题输出警告或错误提示。若未安装sudo yum install rpmlint注意rpmlint 是可选步骤。官方发布脚本tools/release.sh中也只在其已安装时才运行 rpmlintcommand -v rpmlint探测后决定是否执行而rpmbuild则是必需工具。五、仅构建源 RPMSRPM5.1 执行构建rpmbuild -bs miller.spec Wrote: /your/home/dir/rpmbuild/SRPMS/miller-6.2.0-1.el6.src.rpm-bs表示 build source RPM产物是.src.rpm文件以当前仓库版本为例会是miller-6.21.0-1.dist.src.rpm。源 RPM 不包含编译产物而是打包了构建所需的全部原料——源码 tarball 与 spec 文件——任何人都可以用它复现二进制 RPM 的构建。5.2 查看 SRPM 内容清单rpm -qpl ../SRPMS/miller-6.2.0-1.el6.src.rpm-qplquery package list输出miller-6.2.0.tar.gz miller.spec可以看到 SRPM 内恰好包含两个文件发布 tarball 与 spec 文件这正是%autosetup阶段解包构建所需的全部输入。5.3 查看 SRPM 元数据rpm -qpi ../SRPMS/miller-6.2.0-1.el6.src.rpm-qpiquery package info输出类似Name : mlr Relocations: (not relocatable) Version : 6.2.0 Vendor: (none) ...rpm -qpi展示的是 spec 头部声明的 Name、Version、Release、Summary、BuildRequires 等元数据。需要说明文档示例取自 Miller 较早版本当时Name字段为mlr当前仓库的 miller.spec 已统一使用Name: miller因此新构建的 SRPM 中 Name 字段应为miller。六、构建源 RPM 与二进制 RPM6.1 执行完整构建rpmbuild -ba miller.spec-babuild all会依次执行%prep解包、%buildmake build编译出./mlr、%checkmake check运行单元与回归测试、%install安装到暂存目录以及打包阶段最终同时产出源 RPM~/rpmbuild/SRPMS/和二进制 RPM~/rpmbuild/RPMS/arch/。由于%check阶段会跑完整测试套件首次构建耗时较长属正常现象。若某发行版架构上测试依赖缺失导致%check失败可在明确知悉后果的情况下暂时跳过测试但这不在官方文档推荐路径内。6.2 查看二进制 RPM 内容清单rpm -qpl ../RPMS/x86_64/miller-6.2.0-1.el6.x86_64.rpm输出/usr/bin/mlr /usr/share/man/man1/mlr.1.gz与%files清单完全吻合可执行文件安装到/usr/bin/mlrspec 中%{_bindir}/mlrman 手册安装到/usr/share/man/man1/mlr.1.gzspec 中%{_mandir}/man1/mlr.1*。这里的 man 手册由 man/Makefile 的install目标负责拷贝。七、安装与验证7.1 安装二进制 RPMsudo rpm -ivh ../RPMS/x86_64/miller-6.2.0-1.el6.x86_64.rpm Preparing... ########################################### [100%] 1:mlr ########################################### [100%]-iinstall、-vverbose、-h显示进度条。安装完成后mlr即可作为系统命令使用。7.2 验证版本与 man 手册/usr/bin/mlr --version Miller 6.2.0确认版本号与 spec 中Version一致。文档还给出了一种更严格的验证方式man -M /usr/share/man mlr用-M指定 man 手册搜索路径查看mlr手册页并核对 DESCRIPTION 章节中的版本信息是否与预期一致。这样既验证了二进制版本也验证了 man 手册页是否随 RPM 正确安装、内容是否与本次构建的版本匹配。八、与官方发布流程的衔接打包 RPM 不仅是个人分发手段也是 Miller 官方发布流程的一环仓库中有多处佐证docs/src/how-to-release.md 明确写道SRPM 是每次发布必需的发布工件the SRPM is a required release artifact并指向 README-RPM.md 作为准备源 RPM的操作手册tools/release.sh 的pre-release子命令包含phase_3_srpm它会自动检查rpmbuild是否在 PATH 中否则报错退出、复用$HOME/rpmbuild/SPECS与$HOME/rpmbuild/SOURCES目录布局、可选运行rpmlint、执行rpmbuild -bs生成 SRPM并做内容感知的幂等复用按 tarball sha256 判断是否可复用已有 SRPM发布 tarball 由make release_tarball即 create-release-tarball 脚本生成其产物命名与 spec 的Source宏完全对应。因此如果你在维护 Miller 的 RPM 发行完全可以遵循本文的手工流程而如果你只是想在 RHEL/CentOS/Fedora 上快速安装 Miller官方文档 docs/src/installing-miller.md 也提示可尝试yum install miller——但该页同时提醒yum/apt 仓库中的版本可能滞后于官方发布如需最新版本按本文流程自行打包是可靠的选择。九、常见问题与注意事项rpmbuild命令找不到确认已安装rpm-build部分发行版包名为rpmbuild并检查是否在 PATH 中官方发布脚本对此会直接报错并提示install rpm-build。Version与 tarball 不一致rpmbuild会因找不到Source对应的 tarball 而失败。请确保~/rpmbuild/SOURCES/miller-版本.tar.gz与 spec 的Version字段完全一致。构建依赖缺失Miller 是 Go 项目且依赖 cgo构建机必须同时具备golang与gcc否则%build阶段的make build会失败。%check较耗时spec 中默认执行完整测试make check首次构建请耐心等待这也是确保 RPM 质量的一道保障。RPMS 目录按架构分目录二进制 RPM 位于~/rpmbuild/RPMS/arch/如x86_64安装时请使用与机器架构匹配的 RPM 文件。版本与 man 手册一致性安装后建议同时执行mlr --version与man -M /usr/share/man mlr核对二进制版本与手册 DESCRIPTION 章节版本一致防止打包时版本串号。通过以上步骤你可以在任何 RPM 系 Linux 发行版上从 Miller 源码构建出标准、可分发、可复现的源 RPM 与二进制 RPM并纳入自己的软件仓库或镜像体系。赞分享CLI数据分析【免费下载链接】millerMiller is like awk, sed, cut, join, and sort for name-indexed data such as CSV, TSV, and tabular JSON项目地址https://gitcode.com/gh_mirrors/mi/miller点击查看免费下载相关推荐GeoLibre 的 Fedora COPR 打包实现从二进制 RPM 重打包 spec 到 CI 自动发布GeoLibre 的 Fedora COPR 打包实现从二进制 RPM 重打包 spec 到 CI 自动发布 GeoLibre 通过 Fedora 社区的 CGIS数据可视化前端桌面应用后端Unity Test完整指南如何在10分钟内为C语言项目搭建单元测试框架Unity Test完整指南如何在10分钟内为C语言项目搭建单元测试框架 你是否在为C语言项目寻找一个轻量级、高效的单元测试解决方案Unity Test正是数据库KV存储缓存数据存储iOSAppHook进阶如何编写CaptainHook插件并注入到目标应用iOSAppHook进阶如何编写CaptainHook插件并注入到目标应用 iOSAppHook是一款专注于非越狱环境下iOS应用逆向研究的工具集从dyliUI组件前端设计系统上一篇解锁音乐自由QMCDecode全场景音频格式转换指南下一篇如何用AI图像融合工具实现一键产品溶图3分钟打造专业级视觉效果创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考