SPEC file writing - Best Practices
SPEC file writing - Best Practices
这篇是 SPEC 系列的“最佳实践清单”。 目标不是再讲语法,而是减少线上踩坑、提升包的可维护性。
1. 头部字段不要留空
Summary、License、URL、%description 等信息必须完整。
这些信息会直接体现在 rpm -qi 输出里,也是排障和审计的第一入口。
2. 头部字段对齐,降低阅读成本
推荐统一列宽对齐:
1 | Name: mydaemon |
团队协作里,这种“无功能变化但提升可读性”的规范非常值。
3. 分段清晰,段内紧凑
建议:
- 段与段之间空一行。
- 段内不要插入无意义空行。
- 注释聚焦“为什么”,不要重复“做了什么”。
4. 能用宏就不要写死路径
避免硬编码 /usr、/etc、/usr/lib64,优先使用宏:
%{_bindir}%{_libdir}%{_sysconfdir}%{_unitdir}
好处:跨发行版、跨架构更稳,路径迁移成本更低。
5. %install 尽量只做“安装动作”
不推荐在 %install 里手写大量 mkdir/cp。
更推荐把文件安装逻辑放到上游构建系统(Makefile/Makefile.am/CMake install)里,再用:
1 | %install |
这样可以让“构建”和“打包”职责清晰分层。
6. %files 不要重复列目录和子文件
规则:
- 如果已列目录,子项通常会递归包含。
- 不要同一文件在多个子包重复声明。
- 主包不要塞测试文件,测试内容拆到独立包。
7. 文件权限优先在 %files 用 %attr 控制
不要在 %post 用 chmod/chown 兜底。
优先在 %files 声明:
1 | %files |
这样升级行为更可预测。
8. 目录归属必须唯一
同一个目录不应被多个 RPM 同时“拥有”。
否则升级/卸载顺序变化时,容易出现目录被误删或文件归属冲突。
原则:
- 谁创建目录,谁拥有目录。
- 共享目录尽量由基础包统一拥有。
9. 子包拆分要服务于依赖治理
当主包依赖越来越重时,优先拆分:
-libs-devel-tests/-integration-sudoers/-systemd这类可选能力包
子包拆分的目的不是“包越多越好”,而是“安装最小化 + 依赖清晰化”。
10. 特殊构建开关要显式声明
例如容器专用组件、关闭 debug 子包等,都建议在 SPEC 顶部显式写清:
1 | %global include_in_build no |
并配注释说明“为什么”。
11. 养成宏检查与静态检查习惯
高频命令:
1 | # 查看所有宏 |
rpmspec 对发现未展开宏、子包命名异常特别有用。
12. 交付前做“三查一装”
每次发版前至少做:
1 | rpm -qpi xxx.rpm # 包头 |
然后做一次本机安装验证(建议在干净环境):
- 新装
- 升级
- 卸载
重点观察:配置文件覆盖策略、systemd 行为、依赖是否完整。
13. 我的补充看法
写 SPEC 的核心不是“语法背得多熟”,而是“行为可预测”。
你只要把下面三件事做到位,质量就会明显提升:
%install与%files严格对应。- 主包与子包边界稳定。
- 升级路径(配置、脚本、依赖)可重复验证。
做到这三点,SPEC 基本就从“能打包”升级到了“能长期维护”。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 因受!
评论