別の rpm を別の rpm への依存関係としてインストールするにはどうすればよいですか?

別の rpm を別の rpm への依存関係としてインストールするにはどうすればよいですか?

fpm を使用してアプリケーション rpm ファイルを構築しました。そこで python3 を依存関係として設定しているため、メイン rpm の前に自動的にインストールされます。

しかし、3.7 がインストールされています。これを 3.8 に置き換えるには、OS のバージョンが Centos か Awslinux かを確認する必要があり、それに基づいて特定の rpm をインストールする必要があります。

そこで、これらの条件ブロックを preinst スクリプトに保持し、パラメーター --before-install に渡しました。

しかし、rpm のインストール中に停止してしまいます。

そこで、詳細モードで確認してみると、preinst では動作していないことがわかりました。

理由は、プロジェクトがすでにロックを取得しているため、ptyhon インストールでロックを適用できず、インストールを続行できないためです。

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 を作成するために使用するツール:ファクシミリ アプリケーション rpm への依存関係として python3.8 をインストールする必要があります。

-d python3 を使用してこれを依存関係として設定すると、Amazon Linux には 3.7 バージョンがインストールされ、CentOS 8 には 3.6 がインストールされます。3.8 バージョンを使用するには、パッケージをインストールする前に実行する手順がいくつかあります。

そこで、依存関係セクションから python3 を削除し、シェル スクリプトとして --before-install を追加しました。

これは私がそこに保存したシェル スクリプトです。

#!/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

スクリプトはトリガーされますが、シェル スクリプトからの 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 はそれらを解決できません。どちらもユーザー エクスペリエンスが悪くなります。

条件文を巧みに利用すれば、1つのrpm仕様で複数のディストリビューションを扱える。例えば、Python 3.8以上が必要だとする。さまざまなrpmパッケージから借用するCentOSで その他ビルド dep は次のようになります。

%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) を実行して %install を実行します。注意すべき点が 1 つあります。これらのディストリビューションの一部では Python は /usr/bin/python3 で、その他のディストリビューションでは /usr/bin/python38 です。これを変数にするとよいかもしれません。

Amazon の追加リポジトリ python3.8 はデフォルトでは有効になっていません。パッケージ ビルド用に有効にします (たとえば、mock ツールのリポジトリ内)。ユーザーは、これらのパッケージをインストールするにはリポジトリを有効にする必要もあります。

Fedoraのパッケージングマクロは通常、%{python3_sitelib}などの一般的な場所にインストールされたPythonモジュールの適切な依存関係を生成します。amznがこれに対して何をするかはすぐにはわかりませんが、おそらく同じでしょう。そうでない場合は、次のような手動の依存関係を追加する必要があるかもしれません。Requires: python(abi) = 3.8

結果の spec ファイルを、関心のある各固有のディストリビューション (Fedora、RHEL、Amazon Linux、CentOS Stream、SUSE) でビルドします。それぞれに若干異なるパッケージがあるのは面倒ですが、ユーザーにとっては簡単な yum インストール エクスペリエンスになります。

Debian パッケージは読者にとっての練習になります。


fpm のような自動パッケージ ジェネレーターは、それほど賢いパッケージを出力しない可能性があります。典型的なトレードオフは、複数のディストリビューションをサポートする高速ジェネレーターと、複数のディストリビューションの癖を意図的に処理できる人間のパッケージ作成者です。

関連情報