Lock file#
PDMは、pdm.lock
という名前の既存のロックファイルからパッケージを排他的にインストールします。このファイルは、依存関係をインストールするための唯一の情報源として機能します。ロックファイルには、次のような重要な情報が含まれています。:
- すべてのパッケージとそのバージョン
- パッケージのファイル名とハッシュ
- オプションで、パッケージをダウンロードする元のURL(Static URLsも参照)
- 各パッケージの依存関係とマーカー(Inherit the metadata from parentsも参照)
update strategiesをpdm add
として追加します。さらに、pdm install
およびpdm add
コマンドを使用すると、自動的にpdm.lock
ファイルが作成されます。
Should I add pdm.lock
to version control?
場合によります。CIでローカル開発と同じ依存関係バージョンを使用し、予期しない失敗を回避することが目的の場合は、pdm.lock
ファイルをバージョン管理に追加する必要があります。そうでない場合、プロジェクトがライブラリであり、CIでユーザーサイトのインストールを模倣して、PyPIの現在のバージョンで何も壊れないようにしたい場合は、pdm.lock
ファイルをサブミットしないでください。
Install the packages pinned in lock file#
このジョブを実行するための類似したコマンドがいくつかありますが、若干の違いがあります。:
pdm sync
はロックファイルからパッケージをインストールします。pdm update
はロックファイルを更新し、次にpdm sync
を更新します。pdm install
は、プロジェクトファイルの変更をチェックし、必要に応じてロックファイルを更新してからpdm sync
を実行します。
pdm sync
には、インストールされたパッケージを管理するためのオプションもいくつかあります。:
--clean
:ロックファイルに存在しないパッケージを削除します。--clean-unselected
(または--only-keep
):--clean
のより完全なバージョンで、--G
、--d
、--prod
オプションで指定されたグループにないパッケージも削除します。注:デフォルトでは、pdm sync
はロックファイルからすべてのグループを選択するので、--clean-unselected
は--clean
と同じです。ただし、--G
、--d
、--prod
が使用されている場合は除きます。
Hashes in the lock file#
デフォルトでは、pdm install
はロックファイルがpyproject.toml
の内容と一致するかどうかをチェックします。これは、ロックファイルにpyproject.toml
の内容ハッシュを保存することによって行われます。
ロック・ファイル内のハッシュが最新かどうかを確認するには、次のようにします。
1 |
|
依存関係を変更せずにロックファイルを更新したい場合は、--refresh
オプションを使用できます。:
1 |
|
このコマンドは、ロックファイルに記録されているすべてのファイルハッシュも更新します。
Specify another lock file to use#
デフォルトでは、PDMはカレントディレクトリのpdm.lock
を使用します。-L/--lockfile
オプションまたはPDM_LOCKFILE
環境変数を使用して別のロックファイルを指定できます。
1 |
|
このコマンドは、パッケージをpdm.lock
ではなくmy-lockfile.lock
からインストールします。
代替ロックファイルは、異なる環境に競合する依存関係が存在する場合に役立ちます。この場合、それらをまとめてロックすると、PDMでエラーが発生します。そのため、select a subset of dependency groupsを実行し、別々にロックする必要があります。
現実的な例として、プロジェクトがwerkzeug
のリリースバージョンに依存しており、開発時にローカルの開発中のコピーを使用したい場合があります。pyproject.toml
に次のものを追加できます。
1 2 3 4 5 6 |
|
次に、さまざまなオプションを指定してpdm lock
を実行し、さまざまな目的のロックファイルを生成します。:
1 2 3 4 5 6 |
|
ロックファイルのmetadata.groups
フィールドをチェックして、どのグループが含まれているかを確認します。
Option to not write lock file#
ロックファイルを更新せずに依存関係を追加または更新したい場合や、pdm.lock
を生成したくない場合は、--frozen-lockfile
オプションを使用できます。
1 |
|
この場合、ロック・ファイル(存在する場合)は読取り専用になり、書込み操作は実行されません。 ただし、必要に応じて依存関係の解決手順は実行されます。
Lock strategies#
現在、ロック動作を制御する3つのフラグcross_platform
、static_urls
およびdirect_minimal_versions
がサポートされています。
その意味は次のとおりです。--strategy/-S
オプションを使用して、1つ以上のフラグをpdm lock
に渡すことができます。これは、コンマ区切りのリストを指定するか、オプションを複数回渡すことによって行います。
これらのコマンドはどちらも同じように機能します。:
1 2 |
|
フラグはロックファイルにエンコードされ、次にpdm lock
を実行したときに読み込まれます。ただし、フラグ名の前にno_
を付けることでフラグを無効にすることができます。
1 |
|
このコマンドは、ロックファイルをクロスプラットフォームにしません。
Cross platform#
Added in version 2.6.0
Deprecated in 2.17.0
新しい動作については、Lock for specific platforms or Python versionsを参照してください。
デフォルトでは、生成されたロックファイルはcross-platformです。これは、依存関係を解決するときに現在のプラットフォームが考慮されないことを意味します。結果のロックファイルには、すべての可能なプラットフォームとPythonバージョンのホイールと依存関係が含まれます。
ただし、リリースにすべてのホイールが含まれていない場合、誤ったロックファイルが作成されることがあります。
これを回避するには、現在のプラットフォームに関係のないホイールをトリミングして、このプラットフォームのみで動作するロックファイルを作成するようPDMに指示します。これは、--strategy no_cross_platform
オプションをpdm lock
に渡すことで実行できます。
1 |
|
Static URLs#
Added in version 2.8.0
デフォルトでは、PDMはパッケージのファイル名のみをロックファイルに保存するため、異なるパッケージインデックス間での再利用性が向上します。ただし、パッケージの静的URLをロックファイルに保存する場合は、--strategy static_URLs
オプションをpdm lock
に渡すことができます。
1 |
|
設定は同じロックファイルに保存され、記憶されます。--strategy no_static_urls
を渡して無効にすることもできます。
Direct minimal versions#
Added in version 2.10.0
--strategy direct_minimal_versions
を渡して有効にすると、pyproject.toml
で指定された依存関係は、最新バージョンではなく、利用可能な最小バージョンに解決されます。これは、ある範囲の依存関係バージョン内でプロジェクトの互換性をテストしたい場合に便利です。
例えば、pyproject.toml
でflask>=2.0
を指定した場合、他に互換性の問題がなければflask
はバージョン2.0.0
に解決されます。
Note
パッケージの依存関係のバージョン制約は、将来にわたって有効ではありません。最小バージョンへの依存関係を解決すると、下位互換性の問題が発生する可能性があります。たとえば、flask==2.0.0
にはwerkzeug>=2.0
が必要ですが、実際には2年後にリリースされたWerkzeug 3.0.0
では動作しません。
Inherit the metadata from parents#
Added in version 2.11.0
inherit_metadata
ストラテジーを有効にすると、PDMはパッケージの祖先から環境マーカーを継承してマージします。これらのマーカーはロック中にロックファイルにエンコードされるため、インストールが高速化されます。これはバージョン2.11.0
からデフォルトで有効になっています。構成でこのストラテジーを無効にするには、pdm config strategy.inherit_metadata false
を使用します。
inherit_metadata
ストラテジーを有効にすると、PDMはパッケージの祖先から環境マーカーを継承してマージします。これらのマーカーはロック中にロックファイルにエンコードされるため、インストールが高速化されます。これはバージョン2.11.0
からデフォルトで有効になっています。構成でこのストラテジーを無効にするには、pdm config strategy.inherit_metadata false
を使用します。
Exclude packages newer than specific date#
Added in version 2.13.0
--exclude-newer
オプションをpdm lock
に渡すことで、指定された日付より新しいパッケージを除外できます。これは、たとえばビルドの再現性を確保するために、依存関係を特定の日付にロックしたい場合に便利です。
日付はRFC 3339タイムスタンプ(例:2006-12-02T02:07:43Z
)または同じ形式のUTC日付(例:2006-12-02
)で指定できます。
1 |
|
Note
パッケージインデックスは、PEP 700で規定されているように、upload-time
フィールドをサポートしていなければなりません。フィールドが与えられた配布に存在しない場合、その配布は利用できないものとして扱われます。
Set acceptable format for locking or installing#
パッケージのフォーマット(binary/sdist)を制御する場合は、環境変数PDM_NO_BINARY
、PDM_ONLY_BINARY
およびPDM_PREFER_BINARY
を設定できます。
各env変数は、パッケージ名のコンマ区切りのリストです。すべてのパッケージに適用するには、これを:all:
に設定します。例:
1 2 3 4 5 6 7 8 |
|
これらの値は、tool.pdm.resolution
セクションのno-binary
、only-binary
、prefer-binary
キーを使用して、プロジェクトpyproject.toml
で定義することもできます。これらは環境変数と同じ形式を受け入れ、リストもサポートします。
1 2 3 4 5 6 7 8 9 |
|
Note
それぞれの環境変数はpyproject.toml
よりも優先されます。
Allow prerelease versions to be installed#
有効にするには、pyproject.toml
に次の設定を含めます。:
1 2 |
|
Solve the locking failure#
PDMが要件を満たす分解能を見つけられない場合は、エラーが発生します。たとえば
1 2 3 4 5 6 7 |
|
django
の下位バージョンに変更するか、asgiref
の上限を削除することができます。しかし、プロジェクトに適さない場合は、pyproject.toml
で解決されたパッケージのバージョンを上書きする、またはその特定のパッケージをロックしないを試してみてください。
Export locked packages to alternative formats#
pdm.lock
ファイルを他のフォーマットにエクスポートして、CIフローまたはイメージ構築プロセスを簡略化できます。現在サポートされているのはrequirements.txt
フォーマットのみです。
1 |
|
Tip
.pre-commit
hookを使用してpdm export
を実行することもできます。