自定义Nginx模块RPM依赖特定版本Nginx失败,原因何在?
解决Nginx模块RPM包依赖版本不匹配的问题
你遇到的问题其实很明显——你的依赖声明漏掉了RPM包的epoch字段。
看yum给出的错误信息,你要安装的nginx包是1:nginx-1.12.2-1.el7_4.ngx.x86_64,这里开头的1:就是epoch(纪元)字段,它是RPM用来处理特殊版本排序的机制,很多第三方源(比如Nginx官方源)的包都会带上这个字段。而你在spec里写的Requires: nginx == 1.12.2-1.el7_4.ngx完全没包含这个epoch,导致yum认为你要求的版本和实际存在的版本不匹配。
直接修复方法
把你的依赖声明改成包含epoch的格式就行:
Requires: nginx = 1:1.12.2-1.el7_4.ngx
更灵活的进阶方案
硬编码版本号和epoch不是长久之计,下次编译对应不同版本的Nginx时还要手动修改。你可以在spec文件里动态获取当前系统中Nginx包的epoch和版本信息,自动生成依赖声明:
在spec的
%prep或者%build阶段先获取信息:NGINX_EPOCH=$(rpm -q --qf "%{EPOCH}" nginx) # 处理epoch为空的情况(有些包可能没有epoch) if [ "$NGINX_EPOCH" = "(none)" ]; then NGINX_EPOCH="" else NGINX_EPOCH="${NGINX_EPOCH}:" fi NGINX_VERSION=$(rpm -q --qf "%{VERSION}-%{RELEASE}" nginx)然后在Requires里引用这些变量:
Requires: nginx = %{NGINX_EPOCH}%{NGINX_VERSION}
这样不管你编译对应哪个版本的Nginx模块,依赖都会自动匹配正确的版本,不用每次手动调整。
内容的提问来源于stack exchange,提问作者digrouz
相关产品推荐
相关产品推荐

