How to configure custom dynamic metadata¶
pyproject.toml
への静的エントリに適さないproject metadataがある場合は、ビルド中にそのようなデータを適用するためにcustom metadata hookを提供する必要があります。
Alternatives
動的メタデータは、ビルド時および実行時に使用可能な単一の真実のソースを持つ方法です。これを実現するもう1つの方法は、ビルドデータを静的に入力し、importlib.metadataを使用して、プログラムまたはパッケージ内で同じ情報を動的に検索することです。
version fieldが唯一の懸念されるメタデータである場合、Hatchlingは、regex
version sourceやthird-party pluginsなどのいくつかの組み込み方法を提供する。ここでのアプローチも機能するが、より複雑である。
Update project metadata¶
pyproject.toml
の[project]
セクションを変更してください:
- dynamic fieldを、動的に設定するすべてのフィールドの配列として定義します。例:
dynamic=["version","license","authors","maintainers"]
- これらのフィールドのいずれかが
pyproject.toml
に静的定義を持っている場合は、それらの定義を削除します。フィールドを静的および動的に定義することは禁止されています。
動的メタデータプラグインのロードをトリガするセクション[tool.hatch.metadata.hooks.custom]
を追加します。使用するクラスの名前やそのPLUGIN_NAME
に関係なく、その名前を正確に使用してください。セクションに何も含める必要はありません。
プラグインがその作業を行うために追加のサードパーティパッケージを必要とする場合は、それらをpyproject.toml
の[build-system]
セクションのrequires
配列に追加してください。
Implement hook¶
動的検索は、作成したカスタムプラグインで実行する必要があります。default expectationは、プロジェクトのルートにあるhatch_build.py
ファイル内にあることです。MetadataHookInterface
をサブクラス化し、update()
を実装します。たとえば、次のプラグインはJSONファイルからメタデータを読み取ります。:
import json
import os
from hatchling.metadata.plugin.interface import MetadataHookInterface
class JSONMetaDataHook(MetadataHookInterface):
def update(self, metadata):
src_file = os.path.join(self.root, "gnumeric", ".constants.json")
with open(src_file) as src:
constants = json.load(src)
metadata["version"] = constants["__version__"]
metadata["license"] = constants["__license__"]
metadata["authors"] = [
{"name": constants["__author__"], "email": constants["__author_email__"]},
]
- サブクラスを作成するには、MetadataHookInterfaceをインポートする必要があります。
update
メソッド内で操作を実行します。
- 「メタデータ」とは、project metadataを指します。
- メタデータに書き込む場合は、TOML配列に
list
を使用します。リストが必要な場合は、要素が1つであっても必要であることに注意してください。
- TOMLテーブルには
dict
を使用してください。例えばauthors
です。
フックを別の場所に保存する場合は、path
optionを設定します。:
[tool.hatch.metadata.hooks.custom]
path = "some/where.py"
[metadata.hooks.custom]
path = "some/where.py"