Advanced Usage#
Automatic Testing#
Use Tox as the runner#
Toxは、複数のPythonバージョンまたは依存関係セットに対してテストするための優れたツールです。
次のようにtox.ini
を設定して、テストをPDMと統合できます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
|
Toxによって作成されたvirtualenvを使用するには、pdm config python.use_venv true
が設定されていることを確認する必要があります。PDMはpdm lock
からの依存関係をvirtualenvにインストールします。専用のvenvでは、pdm run pytest tests/
の代わりにpytest tests/
によってツールを直接実行できます。
また、テストコマンドでpdm add/pdm remove/pdm update/pdm lock
を実行しないようにしてください。そうしないと、pdm lock
ファイルが予期せず変更されます。deps
構成で追加の依存関係を指定できます。さらに、PDMを正しく動作させるために、isolated_build
およびpassenv
構成を上記の例のように設定する必要があります。
To get rid of these constraints, there is a Tox plugin tox-pdm which can ease the usage. You can install it by
これらの制約を取り除くために、Toxプラグインtox-pdmがあり、使用を容易にすることができます。
1 |
|
または
1 |
|
次のようにしてtox.ini
をさらに整理することができます。:
1 2 3 4 5 6 7 8 9 10 11 12 |
|
See the project's README for a detailed guidance.
詳細なガイダンスについては、project's READMEを参照してください。
Use Nox as the runner#
Noxは、自動テストのためのもう1つの優れたツールです。toxとは異なり、Noxは構成に標準のPythonファイルを使用します。
NoxでPDMを使用する方がはるかに簡単です。次にnoxfile.py
の例を示します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
PDMがvirtualenv内のPythonを正しく取得できるように、PDM_IGNORE_SAVED_PYTHON
を設定する必要があります。また、pdm
がPATH
内で使用可能であることも確認してください。
noxを実行する前に、venvの再利用を有効にするために、構成項目python.use_venv
がtrueであることも確認する必要があります。
About PEP 582 __pypackages__
directory#
デフォルトでは、pdm run
でツールを実行すると、__pypackages__
がプログラムとそれによって作成されたすべてのサブプロセスに表示されます。これは、これらのツールによって作成された仮想環境も__pypackages__
内のパッケージを認識することを意味し、場合によっては予期しない動作を引き起こします。
nox
の場合、noxfile.py
に次の行を追加することでこれを回避できます。
1 |
|
tox
では、PYTHONPATH
はテストセッションに渡されないので、これは問題になりません。さらに、nox
とtox
を独自のpipx環境に置くことをお勧めします。そうすれば、すべてのプロジェクトにインストールする必要がなくなります。この場合、PEP 582パッケージも問題になりません。
Use PDM in Continuous Integration#
PDMはPython 3.7より前のバージョンにはインストールできないので、これらのPythonバージョンでプロジェクトをテストする場合は
PDMが正しいPythonバージョンにインストールされていることを確認する必要があります。このバージョンは、特定のジョブ/タスクが実行されるターゲットPythonバージョンとは異なる場合があります。
幸いなことに、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仮想環境にknown compatibility issueがあります。そのマシンでPDMパラレルインストールが失敗した場合は、parallel_install
をfalse
に設定するか、env LD_PRELOAD=/lib/x86_64-linux-gnu/libgcc_s.so.1
を設定する必要があります。これはすでにpdm-project/setup-pdm
アクションによって処理されています。
Note
適切なユーザーセットを使用せずにCIスクリプトを実行すると、PDMがキャッシュディレクトリを作成しようとしたときにパーミッションエラーが発生する可能性があります。この問題を回避するには、HOME環境変数を書き込み可能なディレクトリに設定します。例:
1 |
|
Use PDM in a multi-stage Dockerfile#
マルチステージDockerfileでPDMを使用して、まずプロジェクトと依存関係を__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 |
|
Use PDM to manage a monorepo#
PDMを使用すると、1つのプロジェクト内に複数のサブパッケージを作成できます。各サブパッケージには独自のpyproject.toml
ファイルがあります。また、すべての依存関係をロックするpdm.lock
ファイルを1つだけ作成できます。サブパッケージは、相互に依存関係を持つことができます。これを行うには、次の手順に従います。
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
が表示されます。すべてのサブパッケージは編集可能モードでインストールされます。
詳細については、🚀 Example repositoryを参照してください。
Hooks for pre-commit
#
pre-commit
は、gitフックを一元的に管理するための強力なフレームワークです。PDMはすでに内部QAチェックにpre-commit
hooksを使用しています。PDMは、ローカルまたはCIパイプラインで実行できるいくつかのフックも公開しています。
Export requirements.txt
#
このフックは、有効な引数とともにコマンドpdm export
をラップします。これをフック(CIなど)として使用して、pdm lock
の実際の内容を反映したrequirements.txt
をコードベースにチェックインすることを確認できます。
1 2 3 4 5 6 7 8 |
|
Check pdm.lock
is up to date with pyproject.toml#
このフックは、有効な引数とともにコマンドpdm lock--check
をラップします。フックとして(たとえばCIのために)使用して、pyproject.toml
に依存関係が追加/変更/削除されたときはいつでも、pdm.lock
も最新であることを確認できます。
1 2 3 4 |
|
Sync current working set with pdm.lock
#
このフックは、有効な引数とともにコマンドpdm sync
をラップします。分岐をチェックアウトまたはマージするたびに、現在の作業セットがpdm.lock
と同期されるようにするフックとして使用できます。システムの認証情報ストアを使用する場合は、additional_dependencies
にkeyringを追加してください。
1 2 3 4 5 6 |
|