如何非交互式使用rpmrebuild重建RPM并修改Requires依赖
问题背景
需要使用rpmrebuild工具重建RPM包,过程中需要修改spec文件中的Requires:依赖行。
现有交互执行流程
当前使用的交互命令如下:
rpmrebuild --edit-spec --notest-install --package <rpm-name> # 弹出提示后手动输入y确认 Do you want to continue ? (y/N) y # 自动打开vi编辑器,手动修改依赖后保存退出,生成新包 result: <updated-rpm-name>
Spec文件修改规则
原有通过rpmbuild -ba <spec-file>生成的spec文件中存在如下依赖配置:
Requires: python(abi) = 3.8
需要将上述配置修改为:
### 注释原有行 # Requires: python(abi) = 3.8 ### 新增如下行 Requires: rh-python38
待实现目标
需要以非交互模式完成上述操作:执行rpmrebuild时无需打开编辑器,可直接通过命令行参数指定修改规则,实现类似如下假想命令的效果:
rpmrebuild --replace-requires --old-requires=python(abi)=3.8 --new-requires=rh-python38 <rpm-name>
已知rpmrebuild提供了spec修改相关的插件能力,但不清楚具体参数使用方法,需要可直接落地的操作指引。
解决方案
直接使用--change-spec-requires参数配合sed流编辑即可实现非交互修改,同时加--batch参数跳过所有交互确认,不需要手动输入y,也不会拉起vi编辑器。
可直接执行的完整命令如下:
rpmrebuild --batch --notest-install --package \ --change-spec-requires="sed 's/^Requires: python(abi) = 3.8$/# Requires: python(abi) = 3.8\nRequires: rh-python38/'" \ <rpm-name>
参数说明
--batch:启用完全非交互模式,自动跳过所有需要用户确认的提示,不会弹出Do you want to continue ?的询问--change-spec-requires:指定处理Requires段的shell命令,rpmrebuild会把所有Requires行通过管道传给该命令处理,用输出结果替换原有Requires段- 传入的sed命令逻辑:精确匹配行首到行尾完全等于
Requires: python(abi) = 3.8的行,将其替换为注释后的原行+换行+新的依赖行,其余Requires行保持不变,不会误改其他依赖配置
验证方法
如果不确定替换结果是否符合预期,可以先加--dry-run参数试运行,不会实际生成RPM包,只会输出修改后的spec内容供校验:
rpmrebuild --dry-run --batch --notest-install --package \ --change-spec-requires="sed 's/^Requires: python(abi) = 3.8$/# Requires: python(abi) = 3.8\nRequires: rh-python38/'" \ <rpm-name>
确认输出的spec中依赖修改正确后,去掉--dry-run执行即可生成修改后的RPM包,生成的包默认存放在~/rpmbuild/RPMS/对应架构目录下。
内容的提问来源于stack exchange,提问作者Puneeth G R
相关产品推荐
相关产品推荐

