第3章 Python 3 RPM のパッケージ化
Python パッケージは、pip インストーラーを使用してアップストリームの PyPI リポジトリーから、または DNF パッケージマネージャーを使用してシステムにインストールできます。DNF は RPM パッケージ形式を使用します。これにより、ソフトウェアのダウンストリーム制御が強化されます。
ネイティブ Python パッケージのパッケージ形式は、Python Packaging Authority (PyPA) 仕様 によって定義されています。ほとんどの Python プロジェクトでは、パッケージ化に distutils または setuptools ユーティリティーを使用し、setup.py ファイルでパッケージ情報を定義しています。ただし、ネイティブ Python パッケージ作成の可能性は、時代とともに進化してきています。新しいパッケージング標準の詳細は、pyproject-rpm-macros を参照してください。
この章では、setup.py を使用する Python プロジェクトを RPM パッケージにパッケージ化する方法を説明します。このアプローチには、ネイティブ Python パッケージと比較して次の利点があります。
-
Python および Python 以外のパッケージへの依存が可能です。依存関係は
DNFパッケージマネージャーによって厳密に適用されます。 - パッケージに暗号で署名できます。暗号化署名を使用すると、RPM パッケージのコンテンツを、オペレーティングシステムの他の部分を使用して検証、統合、およびテストできます。
- ビルドプロセス中にテストを実行できます。
3.1. Python パッケージ用の SPEC ファイルの説明 リンクのコピーリンクがクリップボードにコピーされました!
SPEC ファイルには、rpmbuild ユーティリティーが RPM をビルドする際に使用する指示を記述します。指示は一連のセクションに記述します。SPEC ファイルには、次の 2 つの主要な部分があります。各部分に複数のセクションを定義します。
- Preamble (Body で使用される一連のメタデータ項目を記述)
- Body (指示の主要部分を記述)
Python プロジェクトの RPM SPEC ファイルには、非 Python RPM SPEC ファイルと比較していくつかの詳細があります。
Python ライブラリーの RPM パッケージの名前には、常に python3-、python3.11-、または python3.12- の接頭辞が含まれている必要があります。
その他の詳細は、以下の SPEC ファイルの python3*-pello パッケージの例に記載されています。その詳細の説明は、例の下に記載されている注意事項を参照してください。
Python で書かれたプログラムの spec ファイルの例
%global python3_pkgversion 3.12
Name: python-pello
Version: 1.0.2
Release: 1%{?dist}
Summary: Example Python library
License: MIT
URL: https://github.com/fedora-python/Pello
Source: %{url}/archive/v%{version}/Pello-%{version}.tar.gz
BuildArch: noarch
BuildRequires: python%{python3_pkgversion}-devel
# Build dependencies needed to be specified manually
BuildRequires: python%{python3_pkgversion}-setuptools
# Test dependencies needed to be specified manually
# Also runtime dependencies need to be BuildRequired manually to run tests during build
BuildRequires: python%{python3_pkgversion}-pytest >= 3
%global _description %{expand:
Pello is an example package with an executable that prints Hello World! on the command line.}
%description %_description
%package -n python%{python3_pkgversion}-pello
Summary: %{summary}
%description -n python%{python3_pkgversion}-pello %_description
%prep
%autosetup -p1 -n Pello-%{version}
%build
# The macro only supported projects with setup.py
%py3_build
%install
# The macro only supported projects with setup.py
%py3_install
%check
%{pytest}
# Note that there is no %%files section for the unversioned python module
%files -n python%{python3_pkgversion}-pello
%doc README.md
%license LICENSE.txt
%{_bindir}/pello_greeting
# The library files needed to be listed manually
%{python3_sitelib}/pello/
# The metadata files needed to be listed manually
%{python3_sitelib}/Pello-*.egg-info/
%changelog
* Tue May 31 2016 Adam Miller <maxamillion@fedoraproject.org> - 1.0.2-1
- First pello package
- 1
python3_pkgversionマクロを定義することで、このパッケージがビルドされる Python バージョンを設定します。デフォルトの Python バージョン 3.9 用にビルドするには、マクロをデフォルト値3に設定するか、その行を完全に削除します。- 2
- Python プロジェクトを RPM にパッケージ化するときは、常に
python-接頭辞をプロジェクトの元の名前に追加してください。ここでは元の名前がpelloであるため、ソース RPM (SRPM) の名前はpython-pelloになります。 - 3
BuildRequiresディレクティブは、このパッケージのビルドおよびテストに必要なパッケージを指定します。BuildRequiresには、Python パッケージのビルドに必要なツールを提供するアイテムpython3-devel(もしくはpython3.11-develまたはpython3.12-devel) と、パッケージ化する特定のソフトウェアに必要な関連パッケージであるpython3-setuptoolsなど (もしくはpython3.11-setuptoolsまたはpython3.12-setuptools) を必ず含めます。あるいは、%checkセクションでテストを実行するために必要なランタイムとテストの依存関係を必ず含めます。- 4
- バイナリー RPM (ユーザーがインストールできるパッケージ) の名前を選択する際には、バージョン管理された Python 接頭辞を追加します。デフォルトの Python 3.9 の場合は
python3-接頭辞、Python 3.11 の場合はpython3.11-接頭辞、Python 3.12 の場合はpython3.12-接頭辞を使用します。%{python3_pkgversion}マクロを使用できます。このマクロは、明示的なバージョン (3.11など) に設定しない限り、デフォルトの Python バージョン 3.9 の場合は3と評価されます (脚注 1 を参照)。 - 5
%py3_buildマクロおよび%py3_installマクロは、インストール場所、使用するインタープリター、その他の詳細を指定する追加の引数を使用して、setup.py buildコマンドおよびsetup.py installコマンドをそれぞれ実行します。- 6
%checkセクションは、パッケージ化されたプロジェクトのテストを実行する必要があります。正確なコマンドはプロジェクト自体に依存しますが、%pytestマクロを使用して、RPM に適した方法でpytestコマンドを実行することができます。