5.3. Epoch、Scriptlets、Triggers
このセクションでは、RMP spec ファイルの高度なディレクティブを表す Epoch、Scriptlets、および Triggers について説明します。
これらのディレクティブはすべて、spec ファイルだけでなく、生成される RPM がインストールされるエンドマシンにも影響します。
5.3.1. Epoch ディレクティブ リンクのコピーリンクがクリップボードにコピーされました!
Epoch ディレクティブでは、バージョン番号に基づいて加重依存関係を定義できます。
このディレクティブが RPM の spec ファイルにない場合、Epoch ディレクティブは一切設定されません。これは、Epoch を設定しないと Epoch が 0 になるという一般的な考え方に反しています。ただし、yum ユーティリティーは、depsolve の目的で、0 の Epoch と同様に設定されていない Epoch を処理します。
ただし、spec ファイルでの Epoch のリストは通常省略されます。これは、多くの場合、Epoch 値を導入すると、パッケージのバージョンを比較するときに RPM の動作が予想と異なるものになるためです。
例5.2 Epoch の使用
Epoch: 1 および Version: 1.0 で foobar パッケージをインストールし、他のユーザーが Version 2.0 で foobar をパッケージ化します。ただし、Epoch ディレクティブがない場合、新しいバージョンは更新とはみなされません。RPM パッケージ用のバージョン管理を示す従来の Name-Version-Release ラッパーよりも、Epoch バージョンが推奨されている理由。
Epoch を使用することはほとんどありません。ただし、Epoch は通常、アップグレードの順序の問題を解決するために使用されます。この問題は、ソフトウェアバージョン番号のスキームや、エンコードに基づいて確実に比較できないアルファベット文字を組み込んだバージョンにおける、アップストリームによる変更の副次的効果として見られる場合があります。
5.3.2. Scriptlets ディレクティブ リンクのコピーリンクがクリップボードにコピーされました!
Scriptlets は、パッケージがインストールまたは削除される前または後に実行される一連の RPM ディレクティブです。
Scriptlets は、ビルド時またはスタートアップスクリプト内で実行できないタスクにのみ使用します。
共通の Scriptlet ディレクティブのセットがあります。これらのディレクティブは、%build や %install などの spec ファイルのセクションヘッダーに似ています。これは、標準の POSIX シェルスクリプトとしてよく書かれる、マルチラインのコードセグメントによって定義されます。ただし、ターゲットマシンのディストリビューションの RPM が対応する他のプログラミング言語で書くこともできます。RPM ドキュメントには、利用可能な言語の完全なリストが含まれます。
以下の表には、実行順の Scriptlet ディレクティブのリストが含まれます。スクリプトを含むパッケージは、%pre と %post ディレクティブの間にインストールされ、%preun ディレクティブと %postun ディレクティブ間でアンインストールされることに注意してください。
| ディレクティブ | 定義 |
|---|---|
|
| パッケージのインストールまたは削除の直前に実行されるスクリプトレット。 |
|
| ターゲットシステムにパッケージをインストールする直前に実行されるスクリプトレット。 |
|
| ターゲットシステムにパッケージがインストールされた直後に実行されるスクリプトレット。 |
|
| ターゲットシステムからパッケージをアンインストールする直前に実行されるスクリプトレット。 |
|
| ターゲットシステムからパッケージをアンインストールした直後に実行されるスクリプトレット。 |
|
| トランザクションの最後に実行されるスクリプトレット。 |
5.3.3. スクリプトレット実行の無効化 リンクのコピーリンクがクリップボードにコピーされました!
以下の手順では、rpm コマンドと --no_scriptlet_name_ オプションを使用して、スクリプトレットの実行を無効にする方法を説明します。
手順
たとえば、
%pretransスクリプトレットの実行を無効にするには、次のコマンドを実行します。rpm --nopretrans
# rpm --nopretransCopy to Clipboard Copied! Toggle word wrap Toggle overflow -- noscriptsオプションも使用できます。これは、以下のすべてと同等になります。-
--nopre -
--nopost -
--nopreun -
--nopostun -
--nopretrans -
--noposttrans
-
5.3.4. スクリプトレットマクロ リンクのコピーリンクがクリップボードにコピーされました!
Scriptlets ディレクティブは、RPM マクロでも機能します。
以下の例は、systemd スクリプトレットマクロの使用を示しています。これにより、systemd は新しいユニットファイルについて通知されるようになります。
5.3.5. Triggers ディレクティブ リンクのコピーリンクがクリップボードにコピーされました!
Triggers は、パッケージのインストールおよびアンインストール時に対話できる手段を提供する RPM ディレクティブです。
Triggers は、含まれるパッケージの更新など、予期できないタイミングで実行できます。Triggers はデバッグが難しいため、予期せず実行されたときに破損しないように、安定したな方法で実装する必要があります。このため、Red Hat では、Trigger の使用は最小限に抑えることを推奨します。
1 つのパッケージアップグレードの実行順序と、既存の各 Triggers の詳細は、以下のとおりです。
上記の項目は、/usr/share/doc/rpm-4.*/triggers ファイルにあります。
5.3.6. spec ファイルでのシェルスクリプト以外のスクリプトの使用 リンクのコピーリンクがクリップボードにコピーされました!
spec ファイルの -p スクリプトレットオプションを使用すると、ユーザーはデフォルトのシェルスクリプトインタープリター (-p /bin/sh) の代わりに特定のインタープリターを呼び出すことができます。
次の手順では、pello.py プログラムのインストール後にメッセージを出力するスクリプトの作成方法を説明します。
手順
-
pello.specファイルを開きます。 以下の行を見つけます。
install -m 0644 %{name}.py* %{buildroot}/usr/lib/%{name}/install -m 0644 %{name}.py* %{buildroot}/usr/lib/%{name}/Copy to Clipboard Copied! Toggle word wrap Toggle overflow 上記の行の下に、以下を挿入します。
%post -p /usr/bin/python3 print("This is {} code".format("python"))%post -p /usr/bin/python3 print("This is {} code".format("python"))Copy to Clipboard Copied! Toggle word wrap Toggle overflow - RPM のビルド の説明に従ってパッケージをビルドします。
パッケージをインストールします。
yum install /home/<username>/rpmbuild/RPMS/noarch/pello-0.1.2-1.el8.noarch.rpm
# yum install /home/<username>/rpmbuild/RPMS/noarch/pello-0.1.2-1.el8.noarch.rpmCopy to Clipboard Copied! Toggle word wrap Toggle overflow インストール後に出力メッセージを確認します。
Installing : pello-0.1.2-1.el8.noarch 1/1 Running scriptlet: pello-0.1.2-1.el8.noarch 1/1 This is python code
Installing : pello-0.1.2-1.el8.noarch 1/1 Running scriptlet: pello-0.1.2-1.el8.noarch 1/1 This is python codeCopy to Clipboard Copied! Toggle word wrap Toggle overflow
Python 3 スクリプトを使用するには、spec ファイルの install -m の下に次の行を含めます。
%post -p /usr/bin/python3
%post -p /usr/bin/python3
Lua スクリプトを使用するには、SPEC ファイルの install -m に次の行を含めます。
%post -p <lua>
%post -p <lua>
このようにして、spec ファイルで任意のインタープリターを指定できます。