Lock for specific platforms or Python versions#
Added in version 2.17.0
デフォルトでは、PDMは、pyproject.tomlのrequires-pythonで指定されたPythonバージョン内のすべてのプラットフォームで動作するロックファイルを作成しようとします。これは、開発時に非常に便利です。開発環境でロックファイルを生成し、このロックファイルを使用して、CI/CDまたは本稼働環境で同じ依存関係バージョンを複製できます。
ただし、この方法がうまくいかない場合もあります。たとえば、プロジェクトまたは依存関係に、次のようなプラットフォーム固有の依存関係や、Pythonのバージョンに応じた条件付きの依存関係があるとします。
1 2 3 4 5 6 7 8 | |
この場合、すべてのプラットフォームおよびPythonバージョン(>=3.8)で各パッケージに対して単一の解決を得ることはほとんど不可能です。代わりに、特定のプラットフォームまたはPythonバージョンに対してロックファイルを作成する必要があります。
Specify lock target when generating lock file#
PDMでは、ロックファイルの生成時に1つ以上の環境条件を指定できます。これらの条件には次のものがあります。:
--python=<PYTHON_RANGE>:PEP 440互換のPythonバージョン指定子です。例えば、--python=">=3.8,<3.10"は、Pythonバージョン>=3.8と<3.10のロックファイルを生成します。便宜上、--python=3.10は--python=">=3.10"と同じで、Python 3.10以降を解決することを意味します。--platform=<PLATFORM>:プラットフォーム指定子。たとえば、pdm lock--platform=linuxと指定すると、Linux x86_64プラットフォーム用のロックファイルが生成されます。使用可能なオプションは次のとおりです。:linuxwindowsmacosalpinewindows_amd64windows_x86windows_arm64macos_arm64macos_x86_64macos_X_Y_arm64macos_X_Y_x86_64manylinux_X_Y_x86_64manylinux_X_Y_aarch64musllinux_X_Y_x86_64musllinux_X_Y_aarch64
--implementation=cpython pypy pyston:Pythonの実装指定子です。現在はcpython、pypy、pystonのみがサポートされています。
いくつかの条件を無視することもできます。たとえば、--platform=linuxだけを指定すると、生成されたロックファイルはLinuxプラットフォームとすべての実装に適用されます。
python criterion and requires-python
ロックターゲットの--pythonオプションまたはrequires-python基準は、pyproject.tomlのrequires-pythonによって制限されています。たとえば、requires-pythonが>=3.8で、--python="<3.11"を指定した場合、ロックターゲットは>=3.8,<3.11になります。
Separate lock files or merge into one#
複数のロックターゲットが必要な場合は、ターゲットごとに個別のロックファイルを作成するか、それらを1つのロックファイルに結合できます。PDMは両方の方法をサポートしています。
特定のターゲットで個別のロック・ファイルを作成するには、次のようにします。:
1 2 | |
LinuxおよびPython 3.8に依存関係をインストールする場合は、次のロックファイルを使用できます。:
1 | |
さらに、ロックファイルの依存関係グループのサブセットを選択することもできます。詳細については、hereを参照してください。
複数のターゲットに同じロックファイルを使用する場合は、pdm lockコマンドに--appendを追加します。
1 2 | |
単一のロック・ファイルを使用する利点は、依存性を更新するときに複数のロック・ファイルを管理する必要がないことです。ただし、単一のロック・ファイル内の異なるターゲットに対して異なるロック方針を指定することはできません。また、ロックの更新にかかる時間コストは高くなることが予想されます。
さらに、各ロック・ファイルは1つ以上のロック・ターゲットを持つことができるため、かなり柔軟に使用できます。ロック・ファイル内のいくつかのターゲットをマージし、特定のグループとターゲットを別々のロック・ファイルにロックすることを選択できます。これについては、次のセクションで例を使用して説明します。
Example#
以下にpyproject.tomlの内容を示します。:
1 2 3 4 5 6 7 8 9 10 11 12 | |
上記の例では、numpyの条件付き依存関係バージョンと、WindowsとMacOSのプラットフォーム固有のオプションの依存関係があります。Linux、Windows、MacOSプラットフォーム、Python 3.8と3.9用のロックファイルを生成したいと思います。
1 2 3 4 5 | |
上記のコマンドを順番に実行すると、3つのロックファイルが表示されます。:
pdm.lock:デフォルトのメインロックファイルで、すべてのプラットフォームと>=3.8のPythonバージョンで動作します。プラットフォーム固有の依存関係は含まれていません。このロックファイルにはnumpyの2つのバージョンがあり、それぞれPython 3.9以上と以下に適しています。PDMインストーラはPythonのバージョンに従って正しいバージョンを選択します。py39-windows.lock:Windowsプラットフォームおよび上記のPython 3.9用のロックファイルで、Windows用のオプションの依存関係を含みます。py39-macos.lock:上記のMacOSプラットフォームおよびPython 3.9用のロックファイルで、MacOS用のオプションの依存関係を含みます。