CentOS 7下构建自定义RPM,如何指定特定版本node.js作为依赖?
解决CentOS7中自定义RPM指定特定版本Node.js依赖的问题
从你遇到的报错和尝试的写法来看,核心问题在于RPM对依赖版本的匹配是完全精确的,而nodesource提供的Node.js包带有特殊的版本格式(包含epoch和release后缀),必须完整对应才能被识别。
先搞清楚你需要的Node.js包完整版本标识
在CentOS7上,nodesource的nodejs包版本格式是2:10.5.0-1nodesource,其中:
2:是epoch(RPM用来处理版本号排序的特殊前缀)10.5.0是实际的Node.js版本-1nodesource是release后缀(标识包的发行来源)
你可以在构建环境里执行这条命令,确认已安装包的完整信息:
rpm -q nodejs
输出应该是类似nodejs-2:10.5.0-1nodesource.x86_64,这个完整字符串就是你需要在依赖里指定的内容。
你的尝试为什么失败?
BuildRequires: node = 10.5.0:包名错了!nodesource提供的包叫nodejs,不是node,RPM根本找不到这个包。BuildRequires: nodejs = 10.5.0:缺少了epoch(2:)和release(-1nodesource)部分,RPM会认为这和系统里的2:10.5.0-1nodesource是不同版本,匹配失败。BuildRequires: nodejs.x86_64 = 2:10.5.0-1nodesource:这个写法本身是对的,但报错说明你的构建环境里根本没安装这个版本的nodejs,或者nodesource的源没配置好,导致RPM找不到这个依赖包。
正确的解决步骤
先在构建环境中配置nodesource源并安装指定版本的nodejs
执行以下命令添加Node.js 10.x的nodesource源,然后安装精确版本:curl -sL https://rpm.nodesource.com/setup_10.x | bash - yum install -y nodejs-2:10.5.0-1nodesource.x86_64(如果是离线环境,需要提前下载对应的rpm包手动安装)
在.spec文件中写入正确的依赖
直接复制完整的版本标识到BuildRequires中,两种写法都可以:- 指定架构(更精确,适合只在x86_64环境构建):
BuildRequires: nodejs.x86_64 = 2:10.5.0-1nodesource - 不指定架构(兼容多架构,CentOS7默认x86_64也能识别):
BuildRequires: nodejs = 2:10.5.0-1nodesource
- 指定架构(更精确,适合只在x86_64环境构建):
验证依赖是否正确识别
可以用rpmbuild -ba your-package.spec尝试构建,确认依赖不再报错。
小技巧:自动获取精确依赖字符串
如果怕手动输入出错,可以用这条命令直接生成符合要求的依赖格式:
rpm -q --qf "BuildRequires: %{NAME} = %{EPOCH}:%{VERSION}-%{RELEASE}\n" nodejs
输出结果可以直接复制到你的.spec文件里,完全避免手动输入错误。
内容的提问来源于stack exchange,提问作者Orelsanpls




