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")

期待するところは、ロックファイル群から自動的にインストールするようなサービスが次のようなものを探索するであろうということです:

  1. サービス名を伴うロックファイルでデフォルトインストールを行うもの

  2. サービスの名称を伴う依存関係グループを持った多用途の pylock.toml

  3. pylock.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

  • : 文字列の配列

  • 必須?: いいえ

  • ひらめき: uv

  • 環境マーカ のリストで、ロックファイルが互換性を持っていると考えられる対象。

  • ツール類は、理解しやすいように、専用の/オーバーラップなしの環境マーカを書くべきです。

requires-python

  • : 文字列

  • 必須?: いいえ

  • ひらめき: PDM, Poetry, uv

  • ロックファイルによってサポートされるどんな環境に対しても互換性のある最低限の Python バージョン (すなわち、ロックファイルにとって生存可能な最低限の Python バージョン) を Requires-Python に指定しましょう。

extras

  • : 文字列の配列

  • 必須?: いいえ; デフォルト値は []

  • ひらめき: Provides-Extra (複数回の使用可)

  • このロックファイルがサポートする 追加物 のリスト。

  • ロックする側は、追加物や依存関係グループをサポートするロックファイルを書くことをサポートしないことを選択しても構いません。

  • 追加物をサポートするツール類は、また、依存関係グループをサポートしなければなりません。

  • ツール類は、そのロックファイルが単一目的に使われるように見えても、実効上、多目的に使われるということを伝えるために、ロックファイルを生成するために用いられた入力に追加物が存在しなかった (たとえば、 pyproject.toml ファイルに [project.optional-dependencies] がなかった) ことを伝えるために、明示的にこのキーに空の配列を設定するべきです。

dependency-groups

  • : 文字列の配列

  • 必須?: いいえ; デフォルト値は []

  • ひらめき: 任意のツールの設定: [tool] テーブル

  • 依存関係グループ のリストで、このロックファイルが公式にサポートするもの (すなわち、依存関係グループのユーザは、ツールの UI を経由して指定することが可能であることが期待されています) 。

  • ロックする側は、追加物や依存関係グループをサポートするロックファイルを書くことをサポートしないことを選択しても構いません。

  • 依存関係グループをサポートするツール類は、また、追加物もサポートしなければなりません。

  • たとえロックファイルが単一目的の使用のためのもののように見えても、そのロックファイルが実効上は多目的の使用のためのものであることを伝えるために、ツール類は、当該ロックファイルを生成するために使用された入力には依存関係グループが存在しなかった (たとえば、 pyproject.toml ファイルには [dependency-groups] テーブルがありません) ことを伝えるためにこのキーに明示的に空の配列を設定するべきです。

default-groups

  • : 文字列の配列

  • 必須?: いいえ; デフォルト値は []

  • ひらめき: Poetry, PDM

  • 合成された依存関係グループで、デフォルトでインストールされるべきものを表現するもの (たとえば、 [project.dependencies] が暗黙のうちに表現しているもの) 。

  • packages.marker がそのようなグループが存在することを必要とするような状況で使用されることを意味します。

  • このキーによって列挙されたグループは、ユーザに対してその名称が直接に露出されるのものではなく、代わりにインストーラの UI を通じて露出されるものなので、 dependency-groups には列挙されるべきではありません。

created-by

  • : 文字列

  • 必須?: はい

  • ひらめき: ロックファイルのファイル名の中にその名前を伴うツール類

  • ロックファイルを作成するために使われたツールの名称を記録する。

  • ツール類は、そのロックファイルを生成するためにどんな入力が使われたのかを暗に示すことができるような十分に詳細な情報を記録するために、 [tool] テーブルを使っても構いません。

  • ツール類は、そのツールを見つけ出しやすくするために、それが Python パッケージとして利用可能であれば、そのツールの標準化された名称を記録するべきです。

[[packages]]

  • : テーブルの配列

  • 必須?: はい

  • ひらめき: PDM, Poetry, uv

  • インストールされる かもしれない すべてのパッケージを含む配列。

  • パッケージ群は、異なるデータとともに複数回にわたって列挙されても構いませんが、すべてのインストールされるパッケージ群はインストール時には単一のエントリに絞り込まれなければなりません。

packages.name

  • : 文字列

  • 必須?: はい

  • ひらめき: Name

  • パッケージ名称の normalized

packages.version

  • : 文字列

  • 必須?: いいえ

  • ひらめき: Version

  • パッケージのバージョン番号。

  • バージョン番号は、そのバージョンが安定状態 <stable> になったものとわかった時に指定されるべきです (すなわち、 sdistwheels が特定された時) 。

  • バージョン番号は、使われているソースコードと首尾一貫していることが保証できない時には、含まれてはなりません (すなわち、 ソースコードツリー が使われている時) 。

packages.marker

  • : 文字列

  • 必須?: いいえ

  • ひらめき: PDM

  • 環境マーカ で、いつパッケージがインストールされるべきかを指定するもの。

packages.requires-python

[[packages.dependencies]]

  • : テーブルの配列

  • 必須?: いいえ

  • ひらめき: PDM, Poetry, uv

  • このパッケージに直接に依存する他のエントリを [[packages]] の中に記録する。

  • エントリのひとつひとつはテーブルで、キー毎に比較することで適切なパッケージを曖昧さなしに見つけ出すであろうところの、どの他のパッケージエントリに対応しているかを告げるために必須の、そのような最小限の情報を含んでいます (たとえば、 spam パッケージのふたつのエントリがあるとして、 {name = "spam", version = "1.0.0"} のようなバージョン番号や、 {name = "spam", vcs = { url = "..."} のようなソースを含めておくことができます) 。

  • ツール類は、インストールを行う時にこの情報をつかってはなりません; これは、純粋に、監査の目的のための情報でしかありません。

[packages.vcs]

  • : テーブル

  • 必須?: いいえ; [packages.directory][packages.archive][packages.sdist] 、および [[packages.wheels]] と相互に排他的

  • ひらめき: ダイレクト URL データ構造 <Direct URL Data Structure>

  • 含まれている ソースコードツリー 用のバージョン管理システムの詳細を記録する。

  • ツール類は、ロッキングとインストールの両方または片方のパースペクティブで、バージョン管理システムをサポートしないことを選択しても構いません。

  • ツール類は、利用可能な VCS 型のサブセットだけをサポートすることを選択しても構いません。

  • ツール類は、ユーザに対して、バージョン管理システムを使うことについてオプトイン・オプトアウトの方法を提供するべきです。

  • バージョン管理システムからのインストールは、 直接 URL 参照 から発展したものだと考えられています。

packages.vcs.type
  • : 文字列; サポートされている値は 登録済みの VCS で指定されています

  • 必須?: はい

  • ひらめき: VCS URL群

  • 使われているバージョン管理システムの型。

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

[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
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.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.wheels.name
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]

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

インストール

ロックファイルからインストールする時に踏んでいく段階をこの後にアウトラインします (要求事項は規範的なものですが、一般的な段階と順序は示唆です) :

  1. インストールするために追加物と依存関係グループを集めて、それぞれ extrasdependency_groups をマーカー評価のために設定しましょう。

    1. extras は、デフォルトで空に設定されているべきです。

    2. dependency_groups は、デフォルトで、 default-groups から生成されたものが設定されているべきです。

  2. lock-version によって仕様化されたメタデータバージョンがサポートされているかどうかの確認; 適切な場合にはエラーもしくは警告を発生させなければなりません。

  3. requires-python が指定されているなら、インストール先の環境が要求事項に合致するかどうかの確認; 合致しなければ、エラーを発生させなければなりません。

  4. environments が指定されているなら、環境マーカー表現のうちの少なくともひとつが満足されていることの確認; 表現を満足するものがなければエラーを発生させなければなりません。

  5. [[packages]] の中に列挙されたそれぞれのパッケージについて:

    1. packages.marker が指定されているなら、それを満足しているかどうかの確認; もし満足していなければ、次のパッケージへとスキップしましょう。

    2. packages.requires-python が指定されていれば、それが満足されているかどうかの確認; もし満足されていない時は、エラーを発生させなければなりません。

    3. パッケージと干渉するインスタンスがインストールされるリストに載っていないことの確認; そうでなければ、曖昧さに関するエラーを発生させなければなりません。

    4. パッケージの源 <source> が適切にしていされているかどうか (つまり、そのパッケージのエントリに他の干渉する源がないということ)の確認; 何らかの問題が見つかったら、エラーを発生させなければなりません。

    5. そのパッケージを、インストールするべきパッケージの集合に加えましょう。

  6. インストールされるパッケージのそれぞれについて:

歴史

  • 2025年4月: PEP 751 を通じて 初期バージョンが承認されました。

  • March 2026: Clarify file name precedence for archives, sdists, and wheels.