高度な使用法#
自動テスト#
Tox をランナーとして使用する#
Tox は、複数の Python バージョンや依存関係セットに対してテストを行うための優れたツールです。
次のように tox.ini
を構成して、PDM と統合することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
Tox によって作成された仮想環境を使用するには、pdm config python.use_venv true
を設定していることを確認する必要があります。PDM はその後、pdm lock
からの依存関係を仮想環境にインストールします。専用の venv では、pytest tests/
のように pdm run pytest tests/
の代わりにツールを直接実行できます。
テストコマンドで pdm add/pdm remove/pdm update/pdm lock
を実行しないようにする必要があります。そうしないと、pdm lock
ファイルが予期せず変更されます。追加の依存関係は deps
設定で指定できます。さらに、isolated_build
と passenv
設定を上記の例のように設定して、PDM が正しく動作するようにする必要があります。
これらの制約を取り除くために、使用を容易にする Tox プラグイン tox-pdm があります。次のコマンドでインストールできます。
1 |
|
または、
1 |
|
そして、tox.ini
を次のように整理できます。
1 2 3 4 5 6 7 8 9 10 11 12 |
|
詳細なガイダンスについては、プロジェクトの README を参照してください。
Nox をランナーとして使用する#
Nox は、もう一つの優れた自動テストツールです。Tox とは異なり、Nox は設定に標準の Python ファイルを使用します。
Nox で PDM を使用するのは非常に簡単です。以下は noxfile.py
の例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
PDM_IGNORE_SAVED_PYTHON
を設定して、PDM が仮想環境内の Python を正しく認識できるようにする必要があります。また、pdm
が PATH
に存在することを確認してください。
Nox を実行する前に、python.use_venv
設定項目が true に設定されていることを確認して、venv の再利用を有効にしてください。
PEP 582 __pypackages__
ディレクトリについて#
デフォルトでは、pdm run
を使用してツールを実行すると、__pypackages__
がプログラムおよびそれによって作成されたすべてのサブプロセスによって認識されます。これは、これらのツールによって作成された仮想環境も __pypackages__
内のパッケージを認識することを意味し、いくつかのケースで予期しない動作を引き起こします。
nox
では、noxfile.py
に次の行を追加することでこれを回避できます。
1 |
|
tox
では、PYTHONPATH
はテストセッションに渡されないため、これは問題になりません。さらに、nox
と tox
をそれぞれの pipx 環境に配置して、すべてのプロジェクトにインストールする必要がないようにすることをお勧めします。この場合、PEP 582 パッケージも問題になりません。
継続的インテグレーションで PDM を使用する#
覚えておくべきことは一つだけです -- PDM は Python < 3.7 ではインストールできないため、これらの Python バージョンでプロジェクトをテストする場合は、特定のジョブ/タスクが実行されるターゲット Python バージョンとは異なる Python バージョンで PDM がインストールされていることを確認する必要があります。
幸いなことに、GitHub Action を使用している場合、これを簡単にするための pdm-project/setup-pdm があります。 以下は GitHub Actions のワークフローの例ですが、他の CI プラットフォームに適応させることができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
TIPS
GitHub Action ユーザー向けに、Ubuntu 仮想環境での既知の互換性の問題があります。
PDM の並列インストールがそのマシンで失敗した場合、parallel_install
を false
に設定するか、LD_PRELOAD=/lib/x86_64-linux-gnu/libgcc_s.so.1
環境変数を設定する必要があります。
これは pdm-project/setup-pdm
アクションによって既に処理されています。
Note
CI スクリプトが適切なユーザー設定なしで実行される場合、PDM がキャッシュディレクトリを作成しようとするときに権限エラーが発生する可能性があります。 これを回避するには、書き込み可能なディレクトリに HOME 環境変数を設定できます。例えば:
1 |
|
マルチステージ Dockerfile で PDM を使用する#
PDM をマルチステージ Dockerfile で使用して、最初にプロジェクトと依存関係を __pypackages__
にインストールし、次にこのフォルダーを最終ステージにコピーし、PYTHONPATH
に追加することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
モノレポを管理するために PDM を使用する#
PDM を使用すると、単一のプロジェクト内に複数のサブパッケージを持つことができ、それぞれに独自の pyproject.toml
ファイルを持つことができます。そして、すべての依存関係をロックするために 1 つの pdm.lock
ファイルを作成するだけです。サブパッケージはお互いを依存関係として持つことができます。これを実現するための手順は次のとおりです。
project/pyproject.toml
:
1 2 3 4 5 6 |
|
packages/foo-cli/pyproject.toml
:
1 2 |
|
packages/foo-app/pyproject.toml
:
1 2 |
|
次に、プロジェクトのルートで pdm install
を実行すると、すべての依存関係がロックされた pdm.lock
が作成されます。すべてのサブパッケージは編集可能モードでインストールされます。
詳細については、🚀 例のリポジトリ を参照してください。
pre-commit
のフック#
pre-commit
は、git フックを集中管理するための強力なフレームワークです。PDM はすでに内部 QA チェックのために pre-commit
フック を使用しています。PDM はローカルまたは CI パイプラインで実行できるいくつかのフックも公開しています。
requirements.txt
をエクスポートする#
このフックは、pdm export
コマンドと任意の有効な引数をラップします。これは、pdm lock
の実際の内容を反映する requirements.txt
をコードベースにチェックインすることを保証するためのフック(例:CI)として使用できます。
1 2 3 4 5 6 7 8 |
|
pdm.lock
が pyproject.toml と一致していることを確認する#
このフックは、pdm lock --check
コマンドと任意の有効な引数をラップします。これは、pyproject.toml
に依存関係が追加/変更/削除された場合に pdm.lock
も最新であることを確認するためのフック(例:CI)として使用できます。
1 2 3 4 |
|
現在の作業セットを pdm.lock
と同期する#
このフックは、任意の有効な引数とともに pdm sync
コマンドをラップします。これは、ブランチをチェックアウトまたはマージするたびに現在の作業セットが pdm.lock
と同期されることを保証するためのフックとして使用できます。システムの資格情報ストアを使用する場合は、keyring を additional_dependencies
に追加します。
1 2 3 4 5 6 |
|