Skip to content

PEP 621 Metadata#

プロジェクトのメタデータはpyproject.tomlに保存されます。仕様はPEP 621PEP 631PEP 639で定義されています。PEPsの詳細な仕様を読んでください。

この文書の次の部分では、明示的に指定されていない場合、メタデータは[project]テーブルの下に記述する必要があります。

Multiline description#

TOMLが複数行の文字列をサポートしているため、長い説明を複数の行に分割することができます。新しい行をエスケープすることを忘れないでください。そうすれば、最終的な説明は on one line only in your package metadataに表示されます。新しい行をエスケープすると、インデントも削除されます。:

1
2
3
4
5
6
description = """\
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, \
    sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. \
    Ut enim ad minim veniam, quis nostrud exercitation ullamco \
    laboris nisi ut aliquip ex ea commodo consequat.\
"""

TOML's specification on stringsを参照してください。

Package version#

1
2
[project]
version = "1.0.0"
1
2
3
4
5
6
[project]
...
dynamic = ["version"]

[tool.pdm]
version = { source = "file", path = "mypackage/__version__.py" }

バージョンはmypackage/__version__.pyファイルから読み込まれ、パターン__version__="{version}"が検索されます。

その他の構成の詳細については、pdm-backendドキュメントのdynamic project versionを参照してください。

Python version#

必要なPythonのバージョンは、文字列requires-pythonで指定されます。

1
2
3
4
5
6
7
8
requires-python = ">=3.9"
classifiers = [
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3.9",
    "Programming Language :: Python :: 3.10",
    "Programming Language :: Python :: 3.11",
    ...
]

注:PEP 621によると、PDMは、他の非準拠ツールのようにclassifiersセクションを動的に更新することは許可されていません。したがって、PyPIでパッケージを公開する予定がある場合は、上記のように適切なtrove classifiersも含める必要があります。

License#

ライセンスは文字列licenseで指定されます。:

1
2
3
4
5
license = {text = "BSD-2-Clause"}
classifiers = [
    "License :: OSI Approved :: BSD License",
    ...
]

注:PEP 621によると、PDMは、他の非準拠ツールのようにclassifiersセクションを動的に更新することは許可されていません。したがって、PyPIでパッケージを公開する予定がある場合は、上記のように適切なtrove classifiersも含める必要があります。

Dependency specification#

project.dependenciesは、PEP 440PEP 508に続く依存性指定文字列の配列です。

以下に例を示します。:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[project]
...
dependencies = [
    # Named requirement
    "requests",
    # Named requirement with version specifier
    "flask >= 1.1.0",
    # Requirement with environment marker
    "pywin32; sys_platform == 'win32'",
    # URL requirement
    "pip @ git+https://github.com/pypa/pip.git@20.3.1"
]

Optional dependencies#

いくつかの要件をオプションにすることができます。これはsetuptoolsextras_requireパラメータと似ています。

1
2
3
4
5
6
7
[project.optional-dependencies]
socks = [ 'PySocks >= 1.5.6, != 1.5.7, < 2' ]
tests = [
  'ddt >= 1.2.2, < 2',
  'pytest < 6',
  'mock >= 1.0.1, < 4; python_version < "3.4"',
]

オプションの依存関係のグループをインストールするには、次の手順に従います。"

1
pdm install -G socks

-Gオプションを複数回指定して、複数のグループを含めることができます。

Context variables expansion#

使用しているビルドバックエンドに応じて、PDMは依存関係文字列の一部の変数を展開します。

Environment variables#

1
2
[project]
dependencies = ["flask @ https://${USERNAME}:${PASSWORD}/artifacts.io/Flask-1.1.2.tar.gz"]
1
2
[project]
dependencies = ["flask @ https://{env:USERNAME}:{env:PASSWORD}/artifacts.io/Flask-1.1.2.tar.gz"]

その他の使用方法については、hereを参照してください。

資格情報の漏洩を心配する必要はありません。環境変数は必要に応じて展開され、ロックファイル内でそのまま保持されます。

Relative paths#

相対パスからパッケージを追加すると、PDMは自動的にそれをpdm-backendおよびhatchlingの相対パスとして保存します。

たとえば、pdm add ./my-packageを実行すると、pyproject.tomlに次の行が表示されます。

1
2
[project]
dependencies = ["my-package @ file:///${PROJECT_ROOT}/my-package"]
1
2
[project]
dependencies = ["my-package @ {root:uri}/my-package"]

デフォルトでは、hatchlingは依存性文字列でdirect referencesをサポートしていません。pyproject.tomlでこれを有効にする必要があります。

1
2
[tool.hatch.metadata]
allow-direct-references = true

相対パスは、のインストール時またはロック時に、プロジェクトルートに基づいて展開されます。

Console scripts#

次の内容は:

1
2
[project.scripts]
mycli = "mycli.__main__:main"

setuptoolsスタイルに変換されます。:

1
2
3
4
5
entry_points = {
    'console_scripts': [
        'mycli=mycli.__main__:main'
    ]
}

また、[project.gui-scripts]setuptoolsスタイルでgui_scriptsエントリポイントグループに変換されます。

Entry points#

その他のタイプのエントリポイントは[project.entry-points.<type>]セクションで指定します。フォーマットは[project.scripts]と同じです。:

1
2
[project.entry-points.pytest11]
myplugin = "mypackage.plugin:pytest_plugin"

エントリポイント名にドットやその他の特殊文字が含まれている場合は、引用符(")で囲みます。

1
2
[project.entry-points."flake8.extension"]
myplugin = "mypackage.plugin:flake8_plugin"