如何在RPM spec文件中获取rpm文件路径
解决方案
方案A(最稳定,推荐使用):构建阶段直接把RPM包内置到安装产物中
不需要在%post阶段动态找路径,直接在打RPM包的时候就把对应版本的RPM包放进你的安装目录:
- 把你要内置的同版本RPM包放到rpmbuild的
SOURCES目录下 - 在spec文件的
%install段添加如下逻辑:
%install # 原有%install逻辑保留,新增以下内容 mkdir -p %{buildroot}%{_prefix}/rpm/ # 可通过%{_arch}宏自动适配当前构建的架构 cp %{_sourcedir}/%{name}-%{version}-%{release}.%{_arch}.rpm %{buildroot}%{_prefix}/rpm/
- 在
%files段添加对应文件声明:
%files %{_prefix}/rpm/%{name}-%{version}-%{release}.%{_arch}.rpm
这种方式完全不依赖安装环境的路径,不会出现找不到RPM包的问题。
方案B:在%post安装阶段动态获取RPM路径
如果你确实需要在安装时读取用户本地的原RPM包文件,原生RPM没有直接提供对应内置宏,可以通过脚本逻辑实现:
%post mkdir -p %{_prefix}/rpm/ # 第一步:优先从当前安装命令的参数中提取RPM路径 RPM_PATH=$(ps -ef | grep -E "rpm(-i| --install| -U| --upgrade).*%{name}-%{version}-%{release}" | grep -v grep | awk '{print $NF}') # 第二步:如果从进程参数找不到,全局搜索匹配文件名的RPM包 if [ -z "${RPM_PATH}" ] || [ ! -f "${RPM_PATH}" ]; then RPM_PATH=$(find / -name "%{name}-%{version}-%{release}*.rpm" 2>/dev/null | head -n 1) fi # 第三步:找到文件后执行复制 if [ -f "${RPM_PATH}" ]; then cp "${RPM_PATH}" %{_prefix}/rpm/ fi
注意:该方案存在局限性,全局搜索速度慢、可能匹配到非当前安装的同名RPM包,仅适合部署环境可控的场景使用。
方案C:用户手动传入RPM路径
如果希望完全避免路径匹配错误,可以要求用户安装时通过自定义宏传入路径:
用户执行安装命令时添加参数:
rpm -i --define "_custom_rpm_path /home/user/demo.rpm" /home/user/demo.rpm
spec的%post段直接使用该宏即可:
%post if [ -f "%{_custom_rpm_path}" ]; then mkdir -p %{_prefix}/rpm/ cp "%{_custom_rpm_path}" %{_prefix}/rpm/ fi
内容的提问来源于stack exchange,提问作者Shenxian
相关产品推荐
相关产品推荐

