我管理一个 RPM 包,其版本编号如下:
my-package-1.1.1-1
, my-package-1.1.2-1
, my-package-1.1.3-1
, my-package-1.2.0-0.alpha01.1
.
我现在正在尝试获取另一个依赖包,my-package < 1.2
以便仅安装 1.1 版本。但是,当我使用 进行安装时yum
,它总是会安装最新版本 ( my-package-1.2.0-0.alpha01
),而不是满足要求的版本。
如何检查yum
我的包的版本是什么?
以下是具有要求的软件包的规格:
Name: test
Version: 1
Release: 1
Requires: my-package < 1.2
%description
%prep
%build
%install
%files
我也尝试过Requires: my-package < 0:1.2
但没有成功。
1.2的 rpm 规格my-package
开头为:
Name: my-package
Provides: my-package
Version: 1.2.0
Release: 0.alpha01.1%{?dist}
对于 1.1 版本:
Name: my-package
Provides: my-package
Version: 1.1.3
Release: 1%{?dist}
仅Version:
更改该行以设置不同的版本号。没有设置纪元,所以我假设它将默认为0:
.
rpmdev-vercmp "1.2.0-0.alpha01.1" "1.2"
正确返回1.2.0-0.alpha01.1 > 1.2
。所以我不认为编号是错误的。
奇怪的是:即使我设置Epoch: 200
了 1.2 版本my-package
并将test
软件包设置为要求my-package < 10:1.2
它安装 200:1.2.0 版本。
我认为问题在于yum
没有正确解析构建my-package.rpm
的版本。我该如何检查?
编辑1
以下是使用的一些诊断rpm -q
,看起来版本依赖性是正确的?:
$ rpm -qp --requires test-1-1.x86_64.rpm
my-package < 1.2
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(PayloadIsXz) <= 5.2-1
$ rpm -qp --provides my-package-1.1.3-1.noarch.rpm
my-package
my-package = 1.1.3-1
$ rpm -qp --provides my-package-1.2.0-0.alpha01.1.noarch.rpm
my-package
my-package = 1.2.0-0.alpha01.1
编辑复制步骤!
我制作了复制代码!在从主目录运行的 Centos7 上进行了测试。需要rpmdevtools
并createrepo
安装。
#/bin/bash
echo "Name: my-package
Provides: my-package
Version: \${VERSION}
Release: \${RELEASE}
Summary: NA
License: NA
%description
%prep
%build
%install
%files
" | tee template.spec
echo "Name: has-requirement
Version: 1
Release: 1
Summary: NA
License: NA
Requires: my-package < 1.2
%description
%prep
%build
%install
%files
" | tee has-requirement.spec
vers=("1.1.1" "1.1.2" "1.1.3" "1.2.0")
rpmdev-setuptree
for v in ${vers[@]}; do
VERSION=$v RELEASE="1" envsubst '$${VERSION} $${RELEASE}' < template.spec > my-package.spec
rpmbuild -ba my-package.spec
done
rpmbuild -ba has-requirement.spec
repodir="$PWD/repo"
mkdir -p $repodir
mv ./rpmbuild/RPMS/x86_64/my-package* $repodir
createrepo $repodir
echo "[temp]
name=temp repo
baseurl=file://$repodir
enabled=1
gpgcheck=0" | sudo tee /etc/yum.repos.d/temp.repo
sudo yum clean all; sudo rm -rf /var/cache/yum
sudo yum search my-package --show-duplicates
sudo yum localinstall --assumeno $PWD/rpmbuild/RPMS/x86_64/has-requirement-1-1.x86_64.rpm
答案1
您可以要求rpm
告诉您测试包的要求:
如果已安装:
rpm -q test --requires
如果没有安装:
rpm -qp /path/to/test.rpm --requires
这可以帮助你。
你的错误确实很奇怪;您确定test.rpm
安装的是正确的吗?具有正确的依赖关系?
答案2
为了其他面临 yum 无法识别依赖项版本问题的人,这就是我修复依赖项解析的方法。
在我的依赖包中,rpm 规范标头以以下内容开头:
Name: my-package
Provides: my-package
Version: 1.2.0
Release: 0
该行Provides: my-package
是多余的并且令人困惑,yum
因为它意味着该包的所有版本都提供my-package
。我不完全知道为什么这会导致版本号和纪元号被忽略,但是就是这样。
my-package
从它提供的内容列表中删除包名称,使 yum 按预期遵守版本控制要求。
我认为这可能是 中的一个错误yum
。我还没有测试是否dnf
做同样的事情。