pylock.toml の仕様¶
pylock.toml ファイルのフォーマットは、 Python 環境内で再現可能なインストールを可能とするための依存関係を指定します。
注釈
この仕様は、元々は PEP 751 で定義されました。
ファイル名¶
ロックファイルは、 pylock.toml と命名するか、または、ロックファイル用のファイル名が要望される場合や複数のロックファイルが存在する場合 (すなわち、すべてのファイル名が正規表現 r"^pylock\.([^.]+\.)?toml$" に合致) には正規表現の r"^pylock\.([^.]+\.)?toml$" に合致するように命名されなければなりません。命名されたファイルのプレフィックスとサフィックスは、検出と削除が簡単にできるように、可能な時には小文字でなければならず、たとえば:
if len(filename) > 11 and filename.startswith("pylock.") and filename.endswith(".toml"):
name = filename.removeprefix("pylock.").removesuffix(".toml")
期待するところは、ロックファイル群から自動的にインストールするようなサービスが次のようなものを探索するであろうということです:
サービス名を伴うロックファイルでデフォルトインストールを行うもの
サービスの名称を伴う依存関係グループを持った多用途の
pylock.tomlpylock.tomlのデフォルトインストール
たとえば、 "spam" という名称のクラウドホストサービスなら、そこからインストールするために最初に pylock.spam.toml を探すでしょうし、そのファイルが存在しなければ pylock.toml からインストールし、もしあれば "spam" という名称の依存関係グループを探すでしょう。
ロックファイル (群) は、そのロックファイルのスコープに適切なディレクトリに置かれるべきです。単一の pyproject.toml に対するロックは、たとえば、同じディレクトリの pylock.toml に置かれることでしょう。単一リポジトリ <monorepo> 内の複数のプロジェクトをカバーするロックファイルであれば、 pylock.toml ファイルは、すべてのロックされるプロジェクト群を保持するディレクトリに置かれるものと期待されます。
ファイルフォーマット¶
このファイルのフォーマットは TOML です。
ツール類は、 diff の出力におけるノイズを最小化するために、首尾一貫したやり方でロックファイルを書くべきです。テーブルの中のキー -- トップレベルのテーブルを含めて -- は、 (もしひらめきが必要ならこの仕様ではキーを論理的な順序で書き下ろしています) 一貫した順序で記録されるべきです。同様に、ツール類は、配列を一貫した順序でソートしておくべきです。インラインテーブルの仕様もまた、一貫性を保つべきです。
lock-version¶
型: 文字列;
"1.0"という値必須?: はい
ひらめき: Metadata-Version
ファイルが固守するところのファイルフォーマットバージョンを記録しましょう。
この PEP では、最初の -- そして、将来のアップデートで標準がそれを変更するまでの間の唯一の正当な値である -- バージョンを
"1.0"として仕様化します。ツールがそのメジャーバージョンはサポートしているがマイナーバージョンをサポートしていない場合、ツールは未知のキーに遭遇した時には警告を発するべきです。
ツールがそのメジャーバージョンをサポートしていない時は、エラーを発生させなければなりません。
environments¶
requires-python¶
型: 文字列
必須?: いいえ
ロックファイルによってサポートされるどんな環境に対しても互換性のある最低限の Python バージョン (すなわち、ロックファイルにとって生存可能な最低限の Python バージョン) を Requires-Python に指定しましょう。
extras¶
型: 文字列の配列
必須?: いいえ; デフォルト値は
[]ひらめき: Provides-Extra (複数回の使用可)
このロックファイルがサポートする 追加物 のリスト。
ロックする側は、追加物や依存関係グループをサポートするロックファイルを書くことをサポートしないことを選択しても構いません。
追加物をサポートするツール類は、また、依存関係グループをサポートしなければなりません。
ツール類は、そのロックファイルが単一目的に使われるように見えても、実効上、多目的に使われるということを伝えるために、ロックファイルを生成するために用いられた入力に追加物が存在しなかった (たとえば、 pyproject.toml ファイルに [project.optional-dependencies] がなかった) ことを伝えるために、明示的にこのキーに空の配列を設定するべきです。
dependency-groups¶
型: 文字列の配列
必須?: いいえ; デフォルト値は
[]ひらめき: 任意のツールの設定: [tool] テーブル
依存関係グループ のリストで、このロックファイルが公式にサポートするもの (すなわち、依存関係グループのユーザは、ツールの UI を経由して指定することが可能であることが期待されています) 。
ロックする側は、追加物や依存関係グループをサポートするロックファイルを書くことをサポートしないことを選択しても構いません。
依存関係グループをサポートするツール類は、また、追加物もサポートしなければなりません。
たとえロックファイルが単一目的の使用のためのもののように見えても、そのロックファイルが実効上は多目的の使用のためのものであることを伝えるために、ツール類は、当該ロックファイルを生成するために使用された入力には依存関係グループが存在しなかった (たとえば、 pyproject.toml ファイルには [dependency-groups] テーブルがありません) ことを伝えるためにこのキーに明示的に空の配列を設定するべきです。
default-groups¶
型: 文字列の配列
必須?: いいえ; デフォルト値は
[]合成された依存関係グループで、デフォルトでインストールされるべきものを表現するもの (たとえば、 [project.dependencies] が暗黙のうちに表現しているもの) 。
packages.marker がそのようなグループが存在することを必要とするような状況で使用されることを意味します。
このキーによって列挙されたグループは、ユーザに対してその名称が直接に露出されるのものではなく、代わりにインストーラの UI を通じて露出されるものなので、 dependency-groups には列挙されるべきではありません。
created-by¶
型: 文字列
必須?: はい
ひらめき: ロックファイルのファイル名の中にその名前を伴うツール類
ロックファイルを作成するために使われたツールの名称を記録する。
ツール類は、そのロックファイルを生成するためにどんな入力が使われたのかを暗に示すことができるような十分に詳細な情報を記録するために、 [tool] テーブルを使っても構いません。
ツール類は、そのツールを見つけ出しやすくするために、それが Python パッケージとして利用可能であれば、そのツールの標準化された名称を記録するべきです。
[[packages]]¶
型: テーブルの配列
必須?: はい
インストールされる かもしれない すべてのパッケージを含む配列。
パッケージ群は、異なるデータとともに複数回にわたって列挙されても構いませんが、すべてのインストールされるパッケージ群はインストール時には単一のエントリに絞り込まれなければなりません。
packages.name¶
型: 文字列
必須?: はい
ひらめき: Name
パッケージ名称の normalized 。
packages.version¶
packages.marker¶
packages.requires-python¶
型: 文字列
必須?: いいえ
ひらめき: Requires-Python
パッケージ用の Python バージョン互換性を示す バージョン指定子 を保持する。
[[packages.dependencies]]¶
型: テーブルの配列
必須?: いいえ
このパッケージに直接に依存する他のエントリを [[packages]] の中に記録する。
エントリのひとつひとつはテーブルで、キー毎に比較することで適切なパッケージを曖昧さなしに見つけ出すであろうところの、どの他のパッケージエントリに対応しているかを告げるために必須の、そのような最小限の情報を含んでいます (たとえば、
spamパッケージのふたつのエントリがあるとして、{name = "spam", version = "1.0.0"}のようなバージョン番号や、{name = "spam", vcs = { url = "..."}のようなソースを含めておくことができます) 。ツール類は、インストールを行う時にこの情報をつかってはなりません; これは、純粋に、監査の目的のための情報でしかありません。
[packages.vcs]¶
型: テーブル
必須?: いいえ; [packages.directory] 、 [packages.archive] 、 [packages.sdist] 、および [[packages.wheels]] と相互に排他的
含まれている ソースコードツリー 用のバージョン管理システムの詳細を記録する。
ツール類は、ロッキングとインストールの両方または片方のパースペクティブで、バージョン管理システムをサポートしないことを選択しても構いません。
ツール類は、利用可能な VCS 型のサブセットだけをサポートすることを選択しても構いません。
ツール類は、ユーザに対して、バージョン管理システムを使うことについてオプトイン・オプトアウトの方法を提供するべきです。
バージョン管理システムからのインストールは、 直接 URL 参照 から発展したものだと考えられています。
packages.vcs.type¶
packages.vcs.url¶
型: 文字列
必須?: もし packages.vcs.path が指定されていなければ
ひらめき: VCS URL群
ソースコードツリーへの URL 。
packages.vcs.path¶
型: 文字列
必須?: もし packages.vcs.url が指定されていなければ
ひらめき: VCS URL群
ソースコードツリーのローカルディレクトリへのパス。
相対パスが使われた場合、このファイルの場所からの相対パスでなければなりません。
もし相対パスなら、ポータビリティのために POSIX スタイルのパスセパレータを明示的に使っても構いません。
packages.vcs.requested-revision¶
型: 文字列
必須?: いいえ
ひらめき: VCS URL群
ブランチ/タグ/コミット/リビジョン/その他ユーザが要求したもの。
これは、純粋に情報提供が目的であり、 ダイレクト URL データ構造 <Direct URL Data Structure> を書くことのお膳立てをするものです; リポジトリをチェックアウトするのに使用してはなりません。
packages.vcs.commit-id¶
型: 文字列
必須?: はい
ひらめき: VCS URL群
インストールされる正確なコミット/リビジョン番号。
VCS がリビジョン識別子に基づくコミットハッシュをサポートしているなら、そのようなコミットハッシュとして、ソースコードの不変のバージョンを指し示す目的で、コミット ID を使わなければなりません。
packages.vcs.subdirectory¶
型: 文字列
必須?: いいえ
ひらめき: サブディレクトリ内のプロジェクト群
ソースコードツリー の中のサブディレクトリで、そのプロジェクトのプロジェクトルートがそこにあるもの (例えば、 pyproject.toml ファイルの位置) 。
パスは、ソースコードツリー構造のルートに対して相対的でなければなりません。
[packages.directory]¶
型: テーブル
必須?: いいえ; [packages.vcs] ・ [packages.archive] ・ [packages.sdist] ・ [[packages.wheels]] と相互に排他的
ひらめき: ローカルディレクトリ
それを含む ソースコードツリー のローカルのディレクトリの詳細を記録する。
ツール類は、ロッキングとインストール局面の両方または片方からの、ローカルディレクトリをサポートしないことを選択しても構いません。
ツール類は、ユーザに対して、ローカルディレクトリを使うことに関するオプトイン・オプトアウトの方法を提供するべきです。
ディレクトリからのインストールは、 直接 URL 参照 から派生したと考えられています。
packages.directory.path¶
型: 文字列
必須?: はい
ひらめき: ローカルディレクトリ
ソースコードツリーのあるローカルディレクトリ。
相対パスならば、ロックファイルの位置に対して相対的でなければならない。
相対バスならば、ポータビリティのために POSIX スタイルのパスセパレータを使用しなければなりません。
packages.directory.editable¶
型: ブーリアン
必須?: いいえ; デフォルト値は
falseひらめき: ローカルディレクトリ
ロックの時点でソースコードツリーが編集可能であるか否かを示すフラグ。
インストーラは、ユーザの指示があるか文脈上で、編集可能な状態でのインストールが不要であるか望ましくない場合には、このフラグを無視することを選択しても構いません (例えば、開発目的ではマウントされず、代わりに、読み取り専用で扱われる商用環境にデプロイされるであろうコンテナイメージ)。
packages.directory.subdirectory¶
packages.vcs.subdirectory を参照のこと。
[packages.archive]¶
型: テーブル
必須?: いいえ
ひらめき: アーカイブ URL 群
それを使ってインストールするアーカイブファイルへの直接参照 (これには、ソースコードツリーを含むその他のアーカイブフォーマットと同様に、 sdist や wheel を含めることができます) 。
ツール類は、ロッキングとインストール局面の両方または片方で、アーカイブファイルをサポートしないことを選択しても構いません。
ツール類は、アーカイブファイルを使用するか否かについてのオプトイン/オプトアウトの方法をユーザに提供するべきです。
アーカイブファイルからのインストールは、 直接 URL 参照 から派生したものと考えられています。
packages.archive.url¶
型: 文字列
Required?: if packages.archive.path is not specified
ひらめき: アーカイブ URL 群
The URL to the archive.
packages.archive.path¶
型: 文字列
Required?: if packages.archive.url is not specified
ひらめき: アーカイブ URL 群
The path to the archive.
相対パスが使われた場合、このファイルの場所からの相対パスでなければなりません。
もし相対パスなら、ポータビリティのために POSIX スタイルのパスセパレータを明示的に使っても構いません。
If packages.archive.url is also specified, the filename as specified by this key takes precedence.
packages.archive.size¶
型: 整数
必須?: いいえ
ひらめき: uv ・ シンプルなリポジトリ API
アーカイブファイルのサイズ。
ツール類は、現実的に可能であればファイルサイズを提供するべきです (ファイルサイズは、 HTTP リクエストの HEAD )から得られる Content-Length ヘッダーを通じて利用可能です 。
packages.archive.upload-time¶
型: datetime
必須?: いいえ
ひらめき: シンプルなリポジトリ API
当該ファイルがアップロードされた時刻。
日付と時刻は、 UTC で記録されなければなりません。
[packages.archive.hashes]¶
型: 文字列のテーブル
必須?: はい
ひらめき: PDM, Poetry, uv, シンプルなリポジトリ API
当該ファイルの既知のハッシュ値を列挙したテーブルで、キーがハッシュアルゴリズムで値がハッシュ値のもの。
テーブルは、少なくともひとつのエントリを含んでいなければなりません。
ハッシュアルゴリズムのキーは、小文字であるべきです。
常に、
hashlib.algorithms_guaranteedから採用した安全なアルゴリズム を少なくともひとつ含んでいるべきです (執筆時点では、特に sha256 が推奨されています) 。
packages.archive.subdirectory¶
packages.vcs.subdirectory を参照のこと。
packages.index¶
型: 文字列
必須?: いいえ
ひらめき: uv
シンプルなリポジトリ API からのパッケージインデックス用のベース URL で、 sdist と wheel の両方または片方が見つかるところ (例えば、
https://pypi.org/simple/) 。可能である時には、 -- SBOMs としても知られている -- software bill of materials を生成することを手助けするために、また、 URL が有効ではなくなった時にファイルを探す手助けとするために、これを指定するべきです。
ツール類は、特定のファイルを記録した URL がもはや有効ではない (例えば HTTP エラーコードの 404 を返す) 場合には、インデックスからインストールすることをサポートしても構いません。
[packages.sdist]¶
型: テーブル
必須?: いいえ; [packages.vcs] ・ [packages.directory] ・ [packages.archive] と相互に排他的
ひらめき: uv
パッケージの ソースコード配布物のファイル名 の詳細。
ツール類は、ロッキングとインストール局面の両方または片方で sdist ファイルをサポートしないことを選択しても構いません。
ツール類は、 sdist ファイルを使用することについてオプトイン/オプトアウトの方法をユーザに対して提供するべきです。
packages.sdist.name¶
型: 文字列
必須?: いいえ, packages.sdist.path/ packages.sdist.url の最後の構成品でない時は、同じ値でしょう
ソースコード配布物のファイル名 ファイルのファイル名。
If specified, this key's value takes precedence over the file name found in either packages.sdist.url or packages.sdist.path.
packages.sdist.upload-time¶
packages.archive.upload-time を参照のこと。
packages.sdist.url¶
packages.archive.url を参照のこと。
packages.sdist.path¶
packages.archive.path を参照のこと。
packages.sdist.size¶
packages.archive.size を参照のこと。
packages.sdist.hashes¶
[packages.archive.hashes] を参照のこと。
[[packages.wheels]]¶
型: テーブルの配列
必須?: いいえ; [packages.vcs] ・ [packages.directory] ・ [packages.archive] と相互に排他的
パッケージに関する バイナリ配布物のフォーマット で指定されたように wheel ファイルを記録するためのもの。
ツール類は、ロッキングとインストール局面の両方で、 wheel ファイルをサポートしなければなりません。
packages.wheels.name¶
型: 文字列
必須?: いいえ、 packages.wheels.path / packages.wheels.url の最後の構成部品が同一の値でない時は
バイナリ配布物のフォーマット ファイルのファイル名。
If specified, this key's value takes precedence over the file name found in either packages.wheels.url or packages.wheels.path.
packages.wheels.upload-time¶
packages.archive.upload-time を参照のこと。
packages.wheels.url¶
packages.archive.url を参照のこと。
packages.wheels.path¶
packages.archive.path を参照のこと。
packages.wheels.size¶
packages.archive.size を参照のこと。
packages.wheels.hashes¶
[packages.archive.hashes] を参照のこと。
[[packages.attestation-identities]]¶
型: テーブルの配列
必須?: いいえ
ひらめき: 起源オブジェクト
このパッケージに記録された 任意の ファイルのための証拠を記録したもの。
もし利用可能であれば、ツール類は、証拠の見つかった身元を含めておくべきです。
公開者に特有のキー群は、 インデックスにホストされた証明 <Index hosted attestations> での仕様に従って、そのまま (つまりトップレベルの) テーブルに含まれることになります。
packages.attestation-identities.kind¶
型: 文字列
必須?: はい
ひらめき: 起源オブジェクト
信頼された公開者の一意の身元。
[packages.tool]¶
型: テーブル
必須?: いいえ
ひらめき: 任意のツールの設定: [tool] テーブル
pyproject.toml の仕様 による [tool] テーブルの使い方によく似た使用方法だが、ロックファイルのレベル (これも [tool] を通じて利用可能) の代わりにパッケージバージョンのレベルのもの。
テーブルに記録されたデータは、使い捨て可能でなければなりません (すなわち、インストールされたものに影響を与えてはなりません) 。
[tool]¶
型: テーブル
必須?: いいえ
ひらめき: 任意のツールの設定: [tool] テーブル
[packages.tool] を参照のこと。
例¶
lock-version = '1.0'
environments = ["sys_platform == 'win32'", "sys_platform == 'linux'"]
requires-python = '== 3.12.*'
created-by = 'mousebender'
[[packages]]
name = 'attrs'
version = '25.1.0'
requires-python = '>= 3.8'
[[packages.wheels]]
name = 'attrs-25.1.0-py3-none-any.whl'
upload-time = 2025-01-25T11:30:10.164985+00:00
url = 'https://files.pythonhosted.org/packages/fc/30/d4986a882011f9df997a55e6becd864812ccfcd821d64aac8570ee39f719/attrs-25.1.0-py3-none-any.whl'
size = 63152
hashes = {sha256 = 'c75a69e28a550a7e93789579c22aa26b0f5b83b75dc4e08fe092980051e1090a'}
[[packages.attestation-identities]]
environment = 'release-pypi'
kind = 'GitHub'
repository = 'python-attrs/attrs'
workflow = 'pypi-package.yml'
[[packages]]
name = 'cattrs'
version = '24.1.2'
requires-python = '>= 3.8'
dependencies = [
{name = 'attrs'},
]
[[packages.wheels]]
name = 'cattrs-24.1.2-py3-none-any.whl'
upload-time = 2024-09-22T14:58:34.812643+00:00
url = 'https://files.pythonhosted.org/packages/c8/d5/867e75361fc45f6de75fe277dd085627a9db5ebb511a87f27dc1396b5351/cattrs-24.1.2-py3-none-any.whl'
size = 66446
hashes = {sha256 = '67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0'}
[[packages]]
name = 'numpy'
version = '2.2.3'
requires-python = '>= 3.10'
[[packages.wheels]]
name = 'numpy-2.2.3-cp312-cp312-win_amd64.whl'
upload-time = 2025-02-13T16:51:21.821880+00:00
url = 'https://files.pythonhosted.org/packages/42/6e/55580a538116d16ae7c9aa17d4edd56e83f42126cb1dfe7a684da7925d2c/numpy-2.2.3-cp312-cp312-win_amd64.whl'
size = 12626357
hashes = {sha256 = '83807d445817326b4bcdaaaf8e8e9f1753da04341eceec705c001ff342002e5d'}
[[packages.wheels]]
name = 'numpy-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl'
upload-time = 2025-02-13T16:50:00.079662+00:00
url = 'https://files.pythonhosted.org/packages/39/04/78d2e7402fb479d893953fb78fa7045f7deb635ec095b6b4f0260223091a/numpy-2.2.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl'
size = 16116679
hashes = {sha256 = '3b787adbf04b0db1967798dba8da1af07e387908ed1553a0d6e74c084d1ceafe'}
[tool.mousebender]
command = ['.', 'lock', '--platform', 'cpython3.12-windows-x64', '--platform', 'cpython3.12-manylinux2014-x64', 'cattrs', 'numpy']
run-on = 2025-03-06T12:28:57.760769
インストール¶
ロックファイルからインストールする時に踏んでいく段階をこの後にアウトラインします (要求事項は規範的なものですが、一般的な段階と順序は示唆です) :
インストールするために追加物と依存関係グループを集めて、それぞれ
extrasとdependency_groupsをマーカー評価のために設定しましょう。extrasは、デフォルトで空に設定されているべきです。dependency_groupsは、デフォルトで、 default-groups から生成されたものが設定されているべきです。
lock-version によって仕様化されたメタデータバージョンがサポートされているかどうかの確認; 適切な場合にはエラーもしくは警告を発生させなければなりません。
requires-python が指定されているなら、インストール先の環境が要求事項に合致するかどうかの確認; 合致しなければ、エラーを発生させなければなりません。
environments が指定されているなら、環境マーカー表現のうちの少なくともひとつが満足されていることの確認; 表現を満足するものがなければエラーを発生させなければなりません。
[[packages]] の中に列挙されたそれぞれのパッケージについて:
packages.marker が指定されているなら、それを満足しているかどうかの確認; もし満足していなければ、次のパッケージへとスキップしましょう。
packages.requires-python が指定されていれば、それが満足されているかどうかの確認; もし満足されていない時は、エラーを発生させなければなりません。
パッケージと干渉するインスタンスがインストールされるリストに載っていないことの確認; そうでなければ、曖昧さに関するエラーを発生させなければなりません。
パッケージの源 <source> が適切にしていされているかどうか (つまり、そのパッケージのエントリに他の干渉する源がないということ)の確認; 何らかの問題が見つかったら、エラーを発生させなければなりません。
そのパッケージを、インストールするべきパッケージの集合に加えましょう。
インストールされるパッケージのそれぞれについて:
[packages.vcs] がセットされていれば:
packages.vcs.commit-id で指定されているコミット ID へリポジトリをクローン <clone> しましょう。
packages.vcs.subdirectory を尊重しつつ、パッケージを ビルド しましょう。
インストール しましょう。
そうではなくて、 [packages.directory] がセットされている場合:
packages.directory.subdirectory を尊重しつつ、パッケージを ビルド しましょう。
インストール しましょう。
そうではなくて、 [packages.archive] がセットされている場合:
ファイルを取得してください。
packages.archive.size と [packages.archive.hashes] を使って検証しましょう。
packages.archive.subdirectory を尊重しつつ、パッケージを ビルド してください。
インストール しましょう。
そうではなくて、 [[packages.wheels]] のエントリが存在する場合:
packages.wheels.name に従って適切な wheel ファイルを探しましょう; それが見つからなければ、 [packages.sdist] に進むか、または、プロジェクトのためのソースが欠落していることについてエラーを発生させなければなりません。
ファイルを取得しましょう:
packages.wheels.path がセットされているなら、それを使いましょう。
そうではなくて、 packages.wheels.url がセットされているなら、それを使うことを試みましょう; オプションとして、ツール類は、 packages.index か、ツール特有の選択された wheel ファイルをダウンロードするための何らかのメカニズムを使っても構いません (ツール類は、どの wheel ファイルをダウンロードするのかを、どれが利用可能であるかに基づいて変更しようと試みてはなりません; どのファイルをインストールするのかについては、再現性の確保のために、オフラインの様式で決定されるべきです) 。
packages.wheels.size や packages.wheels.hashes を用いて、正当性の検証をしましょう。
インストール しましょう。
そうではなくて、 [[packages.wheels]] ファイルが見つからないか、または、 [packages.sdist] だけがセットされている場合:
ファイルを取得してください。
packages.sdist.path がセットされていれば、それを使いましょう。
そうではなくて、 packages.sdist.url がセットされている場合は、それを使うことを試みましょう; ツール類は、 packages.index を使っても構いませんし、 ツールに特有のファイルをダウンロードする何らかのメカニズムを使っても構いません。
packages.sdist.size と packages.sdist.hashes を使って正当性を検証しましょう。
パッケージを ビルド しましょう。
インストール しましょう。
歴史¶
2025年4月: PEP 751 を通じて 初期バージョンが承認されました。
March 2026: Clarify file name precedence for archives, sdists, and wheels.