如何安裝另一個 rpm 作為另一個 rpm 的依賴項?

如何安裝另一個 rpm 作為另一個 rpm 的依賴項?

我們使用 fpm 建立了應用程式 rpm 檔案。我們將 python3 設定為依賴項,因此它會在主 rpm 之前自動安裝。

但它安裝的是3.7。要將其替換為 3.8,我們需要先檢查作業系統版本是 centos 還是 awslinux,並根據該版本安裝特定的 rpm。

因此,我將這些條件區塊保留在 preinst 腳本中並傳遞給參數 --before-install。

但是,在 rpm 安裝過程中卻遇到了困難。

所以,當我檢查詳細模式時。我發現它不能與 preinst 一起使用。

原因是 ptyhon install 無法套用鎖定並繼續安裝,因為projectn 已經獲得了鎖定。

RPM: error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Resource temporarily unavailable)
Error: Could not run transaction.


+ echo 'centos is detected'
centos is detected
+ sudo yum install -yq python38
RPM: error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Resource temporarily unavailable)
Error: Could not run transaction.

您可以提供的任何建議

更具體的,請查看下面的詳細資訊。

創建rpm的工具:氟PM 我需要安裝 python3.8 作為應用程式 rpm 的依賴項。

如果我使用 -d python3 將其設定為依賴項,則它將在 amazon linux 上安裝 3.7 版本,在 centos 8 上安裝 3.6 版本。

因此,我從依賴項部分中刪除了 python3 並添加到 --before-install 作為 shell 腳本。

這是我保存在那裡的 shell 腳本。

#!/bin/bash
echo "Starting preinst"

echo "Checking OS Version"


DISTRO=$(cat /etc/*-release | grep -w NAME | cut -d= -f2 | tr -d '"' | tr '[:upper:]' '[:lower:]')

if [[ "$DISTRO" =~ "centos linux" ]]; then
  echo "centos is detected"
  sudo yum install -yq python38
elif [[ "$DISTRO" =~ "amazon linux" ]]; then
  echo "amazon linux detected"
  sudo yum install -yq amazon-linux-extras
  sudo amazon-linux-extras enable python3.8
  sudo yum install -yq python3.8
elif [[ "$DISTRO" =~ "ubuntu" ]]; then
  echo "ubuntu detected"
  sudo apt install pyhton3 -yq
else
  echo "Neither centos nor amazon linux 2"
fi

它正在觸發腳本,但卡在 shell 腳本的 python 安裝中。

RPM: error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Resource temporarily unavailable)
Error: Could not run transaction.


+ echo 'centos is detected'
centos is detected
+ sudo yum install -yq python38
RPM: error: can't create transaction lock on /var/lib/rpm/.rpm.lock (Resource temporarily unavailable)
Error: Could not run transaction.

對於如何解決這個問題,有任何的建議嗎?

我的要求是安裝 python3.8 作為我們產品 rpm 的一部分,也作為依賴項。

答案1

在另一個 rpm 的腳本中安裝 rpm 不起作用。已處於 rpm 事務。此外,依賴項不在包元資料中,yum/dnf 無法解析它們。其中任何一個都是糟糕的使用者體驗。

透過創造性地使用條件,可以在一個 rpm 規格中實現多個發行版。假設您至少需要 Python 3.8。借用各種rpm包在 CentOS 中 和其他地方,建構部門可能看起來像:

%if 0%{?fedora} || 0%{?rhel} > 8 
BuildRequires: python3-devel
%endif
%if 0%{?amzn} || 0%{?rhel} == 8 || 0%{?suse_version} > 1500
BuildRequires: python38-devel
%endif

請注意奇怪的零前綴數字。即使未定義變量,這也允許在表達式中使用。

繼續Fedora 的 Python 打包指南或EL)來%安裝這個東西。一件棘手的事情:對於其中一些發行版,Python 是 /usr/bin/python3,其他發行版是 /usr/bin/python38。不妨將其設為一個變數。

Amazon extra repo python3.8 預設未啟用。為套件建置啟用它,例如在模擬工具的儲存庫中。用戶還需要啟用儲存庫才能安裝這些軟體包。

Fedora 打包巨集通常會為安裝在 %{python3_sitelib} 等典型位置的 python 模組產生適當的依賴項,我不知道 amzn 對此做了什麼,可能是一樣的。如果沒有,您可能需要新增手動 deps,例如Requires: python(abi) = 3.8

在每個感興趣的獨特發行版上建立產生的規格文件:Fedora、RHEL、Amazon Linux、CentOS Stream、SUSE。雖然每個軟體包略有不同很煩人,但它的結果是為用戶提供了輕鬆的 yum 安裝體驗。

Debian 軟體包是給讀者的練習。


像 fpm 這樣的自動包產生器可能不會輸出聰明的包。經典的權衡:支援多個發行版的快速生成器,與可以根據多個發行版的怪癖做一些有意識的事情的人類打包者。

相關內容