Package-Management

Yum 不尊重 Requires 最高版本。如何調試和檢查 yum 認為的 依賴版本是什麼?

  • May 21, 2019

我管理一個 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沒有成功。

my-package1.2的 rpm 規範以:

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沒有正確解析 buildmy-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

為了其他人面臨 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做同樣的事情。

您可以要求rpm告訴您測試包的要求:

如果已安裝:

rpm -q test --requires

如果未安裝:

rpm -qp /path/to/test.rpm --requires

這可以幫助你。

你的錯誤確實很奇怪;你確定test.rpm正在安裝正確的嗎?有正確的依賴?

引用自:https://unix.stackexchange.com/questions/519480