我們使用 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 這樣的自動包產生器可能不會輸出聰明的包。經典的權衡:支援多個發行版的快速生成器,與可以根據多個發行版的怪癖做一些有意識的事情的人類打包者。