CentOS/RHEL 7下能否后置安装spec文件中的Requires依赖?
首先明确:默认情况下,RPM会先安装所有Requires/PreReq声明的依赖包,再执行当前包的脚本,所以你想让当前包的脚本先于依赖包的脚本执行,常规的Requires或PreReq是做不到的——因为PreReq在RPM 4.4+版本中已经和Requires的优先级一致,仍然会先安装依赖包。
你的核心问题是依赖包MyServerPackage的%pre脚本需要你生成的/tmp/mylicense文件,但当前包的%pre执行时机晚于依赖包的%pre,导致报错。下面给你几个可行的解决思路:
方法1:将许可证生成脚本移到%pretrans段
这是最推荐的方案,不需要修改依赖包的配置。
RPM的脚本执行顺序中,%pretrans是在整个安装事务启动后、所有包(包括依赖包)安装之前执行的,属于当前包的前置前置脚本。你只需要把生成/tmp/mylicense的代码从%pre移到%pretrans即可:
%pretrans # 这里写生成/tmp/mylicense的脚本逻辑 echo "Generating license file..." touch /tmp/mylicense # 其他生成逻辑...
这样执行顺序就变成:
- 运行当前包的
%pretrans,生成/tmp/mylicense - 安装依赖包
MyServerPackage,它的%pre脚本就能找到已生成的文件 - 继续执行当前包的
%pre、文件安装、%post等后续步骤
方法2:拆分出独立的许可证生成前置包(若能修改依赖包配置)
如果你有权修改MyServerPackage的spec文件,可以拆分一个专门生成许可证的包(比如mylicense-generator),然后在MyServerPackage的spec中添加:
Requires(pre): mylicense-generator
这样安装时会先安装mylicense-generator,它的%pre或%post生成/tmp/mylicense,再安装MyServerPackage时就能正常执行其%pre脚本。不过这个方法需要你能控制依赖包的构建,适用性有限。
方法3:临时强制安装(不推荐生产环境)
如果只是临时测试,你可以先用--nodeps参数跳过依赖检查,先安装自己的包:
rpm -ivh your-package.rpm --nodeps
等你的包生成/tmp/mylicense后,再正常安装MyServerPackage。但这种方法会跳过依赖校验,可能导致系统依赖缺失,只适合临时场景。
内容的提问来源于stack exchange,提问作者crashdog

