Skip to content

How to configure custom dynamic metadata


pyproject.tomlへの静的エントリに適さないproject metadataがある場合は、ビルド中にそのようなデータを適用するためにcustom metadata hookを提供する必要があります。

Alternatives

動的メタデータは、ビルド時および実行時に使用可能な単一の真実のソースを持つ方法です。これを実現するもう1つの方法は、ビルドデータを静的に入力し、importlib.metadataを使用して、プログラムまたはパッケージ内で同じ情報を動的に検索することです。

version fieldが唯一の懸念されるメタデータである場合、Hatchlingは、regex version sourcethird-party pluginsなどのいくつかの組み込み方法を提供する。ここでのアプローチも機能するが、より複雑である。

Update project metadata

pyproject.toml[project]セクションを変更してください:

  1. dynamic fieldを、動的に設定するすべてのフィールドの配列として定義します。例:dynamic=["version","license","authors","maintainers"]
  1. これらのフィールドのいずれかが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__"]},
            ]
  1. サブクラスを作成するには、MetadataHookInterfaceをインポートする必要があります。
  1. updateメソッド内で操作を実行します。
  1. 「メタデータ」とは、project metadataを指します。
  1. メタデータに書き込む場合は、TOML配列にlistを使用します。リストが必要な場合は、要素が1つであっても必要であることに注意してください。
  1. TOMLテーブルにはdictを使用してください。例えばauthorsです。

フックを別の場所に保存する場合は、path optionを設定します。:

[tool.hatch.metadata.hooks.custom]
path = "some/where.py"
[metadata.hooks.custom]
path = "some/where.py"