Yum 不尊重“需要”最高版本。如何调试和检查 yum 认为的依赖版本是什么?

Yum 不尊重“需要”最高版本。如何调试和检查 yum 认为的依赖版本是什么?

我管理一个 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 上进行了测试。需要rpmdevtoolscreaterepo安装。

#/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做同样的事情。

相关内容