Skip to content

Lock for specific platforms or Python versions#

Added in version 2.17.0

デフォルトでは、PDMは、pyproject.tomlrequires-pythonで指定されたPythonバージョン内のすべてのプラットフォームで動作するロックファイルを作成しようとします。これは、開発時に非常に便利です。開発環境でロックファイルを生成し、このロックファイルを使用して、CI/CDまたは本稼働環境で同じ依存関係バージョンを複製できます。

ただし、この方法がうまくいかない場合もあります。たとえば、プロジェクトまたは依存関係に、次のようなプラットフォーム固有の依存関係や、Pythonのバージョンに応じた条件付きの依存関係があるとします。

1
2
3
4
5
6
7
8
[project]
name = "myproject"
requires-python = ">=3.8"
dependencies = [
    "numpy<1.25; python_version < '3.9'",
    "numpy>=1.25; python_version >= '3.9'",
    "pywin32; sys_platform == 'win32'",
]

この場合、すべてのプラットフォームおよび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プラットフォーム用のロックファイルが生成されます。使用可能なオプションは次のとおりです。:
    • linux
    • windows
    • macos
    • alpine
    • windows_amd64
    • windows_x86
    • windows_arm64
    • macos_arm64
    • macos_x86_64
    • macos_X_Y_arm64
    • macos_X_Y_x86_64
    • manylinux_X_Y_x86_64
    • manylinux_X_Y_aarch64
    • musllinux_X_Y_x86_64
    • musllinux_X_Y_aarch64
  • --implementation=cpython pypy pyston:Pythonの実装指定子です。現在はcpythonpypypystonのみがサポートされています。

いくつかの条件を無視することもできます。たとえば、--platform=linuxだけを指定すると、生成されたロックファイルはLinuxプラットフォームとすべての実装に適用されます。

python criterion and requires-python

ロックターゲットの--pythonオプションまたはrequires-python基準は、pyproject.tomlrequires-pythonによって制限されています。たとえば、requires-python>=3.8で、--python="<3.11"を指定した場合、ロックターゲットは>=3.8,<3.11になります。

Separate lock files or merge into one#

複数のロックターゲットが必要な場合は、ターゲットごとに個別のロックファイルを作成するか、それらを1つのロックファイルに結合できます。PDMは両方の方法をサポートしています。

特定のターゲットで個別のロック・ファイルを作成するには、次のようにします。:

1
2
# Generate a lock file for Linux platform and Python 3.8, write the result to py38-linux.lock
pdm lock --platform=linux --python="==3.8.*" --lockfile=py38-linux.lock

LinuxおよびPython 3.8に依存関係をインストールする場合は、次のロックファイルを使用できます。:

1
pdm install --lockfile=py38-linux.lock

さらに、ロックファイルの依存関係グループのサブセットを選択することもできます。詳細については、hereを参照してください。

複数のターゲットに同じロックファイルを使用する場合は、pdm lockコマンドに--appendを追加します。

1
2
# Generate a lock file for Linux platform and Python 3.8, append the result to pdm.lock
pdm lock --platform=linux --python="==3.8.*" --append

単一のロック・ファイルを使用する利点は、依存性を更新するときに複数のロック・ファイルを管理する必要がないことです。ただし、単一のロック・ファイル内の異なるターゲットに対して異なるロック方針を指定することはできません。また、ロックの更新にかかる時間コストは高くなることが予想されます。

さらに、各ロック・ファイルは1つ以上のロック・ターゲットを持つことができるため、かなり柔軟に使用できます。ロック・ファイル内のいくつかのターゲットをマージし、特定のグループとターゲットを別々のロック・ファイルにロックすることを選択できます。これについては、次のセクションで例を使用して説明します。

Example#

以下にpyproject.tomlの内容を示します。:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[project]
name = "myproject"
requires-python = ">=3.8"
dependencies = [
    "numpy<1.25; python_version < '3.9'",
    "numpy>=1.25; python_version >= '3.9'",
    "pandas"
]

[project.optional-dependencies]
windows = ["pywin32"]
macos = ["pyobjc"]

上記の例では、numpyの条件付き依存関係バージョンと、WindowsとMacOSのプラットフォーム固有のオプションの依存関係があります。Linux、Windows、MacOSプラットフォーム、Python 3.8と3.9用のロックファイルを生成したいと思います。

1
2
3
4
5
pdm lock --python=">=3.9"
pdm lock --python="<3.9" --append

pdm lock --platform=windows --python=">=3.9" --lockfile=py39-windows.lock --with windows
pdm lock --platform=macos --python=">=3.9" --lockfile=py39-macos.lock --with macos

上記のコマンドを順番に実行すると、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用のオプションの依存関係を含みます。