`poetry-dynamic-versioning`を導入して、Poetryのバージョン情報をGitHubのバージョンタグから生成するようにした

# 環境
* Python 3.11.2
* poetry-dynamic-versioning v0.21.4
* poetry 1.4.2


# はじめに
Pythonでツールを開発しています。
[poetry-dynamic-versioning](https://github.com/mtkennerly/poetry-dynamic-versioning)を使って、GitHubのバージョンタグから、バージョン情報を生成するようにしました。その際にやったことなどをメモとして残しておきます。


# poetry-dynamic-versioningの導入前の状態

```toml:pyproject.toml
[tool.poetry]
name = "awesome"
authors = ["yuji38kwmt"]
version = "0.69.1"
description = ""

packages = [
    { include = "awesome" }
]

[tool.poetry.dependencies]
python = "^3.11"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"
```

```python:awesome/__version__.py
version = "0.69.1"
```


# poetry-dynamic-versioningの導入後の状態

```toml:pyproject.toml
[tool.poetry]
# ...
version = "0.0.0"  # poetry-dynamic-versioningによって書き換わる

# ...
[tool.poetry-dynamic-versioning]
enable = true
format = "{base}"

[build-system]
requires = ["poetry-core>=1.0.0", "poetry-dynamic-versioning"]
build-backend = "poetry_dynamic_versioning.backend"
```

```python:awesome/__version__.py
version = "0.0.0"  # poetry-dynamic-versioningによって書き換わる
```

# 解説


## `__version__.py`のバージョンの置き換え

デフォルトでは`["*.py", "*/__init__.py", "*/__version__.py", "*/_version.py"]`のバージョン情報が置き換わります。

# 補足
## 最新のバージョンタグが付与されたコミットと一致していない場合
`poetry build`したときのコミットが、最新のバージョンタグが付与されたコミットと一致しない場合、`0.68.0.post10.dev0+a78179f`のようなバージョンになり、バージョンタグに存在しない情報も付与されます。
最初の`0.68.0`はバージョンタグから取得した情報（`style`設定では`base`という名前で参照可能）です。`.post10`の`10`は最新のバージョンタグから、離れているコミットの個数（`style`設定では`distance`という名前で参照可能）です。`+`以降の`a78179f`はコミットのハッシュ値です。

`poetry build`したときのコミットが、最新のバージョンタグが付与されたコミットと一致する場合は、`0.68.0`というバージョンになります。

## `style`の設定
`format`,`style`を指定しない場合は [PEP 440](https://peps.python.org/pep-0440/)に従ったバージョンになります。

>style (string, default: unset): One of: pep440, semver, pvp. These are preconfigured output formats. If you set both a style and a format, then the format will be validated against the style's rules. If style is unset, the default output format will follow PEP 440, but a custom format will only be validated if style is set explicitly.[^1]

[^1]: https://github.com/mtkennerly/poetry-dynamic-versioning/tree/3570ad9bf3122856be42e475702a9e8c35c7a2b5#configuration

`style`には、以下の値を指定できます。styleの値によって、どのようなバージョンになるかを確認しました。

* `pep440` (PEP 440) : `0.68.0.post14.dev0+424893f`
* `semver` (Semantic Versioning) : `0.68.0.post14+424893f`
* `pvp` (Haskell Package Versioning Policy) : `0.68.0-post-14-424893f` （PEP440に従っていないため、`poetry build`は失敗します）

## `format`の設定
`format`に指定できる変数の説明は、poetry-dynamic-versioningが依存している[dunamai](https://github.com/mtkennerly/dunamai)というライブラリのページに詳細が記載されています。

`poetry build`したときのコミットが、最新のバージョンタグが付与されたコミットと一致しない場合でも、`0.68.0`のようなバージョンにしたい場合は、`format = "{base}"`を設定すればよいです。




## バージョンを生成する処理
バーションを生成の具体的な処理は、以下のコードが参考になります。

https://github.com/mtkennerly/poetry-dynamic-versioning/blob/500f406b16b3bbfa72c78c57c67dca17dfd5ed09/poetry_dynamic_versioning/__init__.py#L511-L518

https://github.com/mtkennerly/dunamai/blob/d6a0e3f280eb9c075426e36f5e34f15db185493f/dunamai/__init__.py#L671-L679


## 参考にしたサイト

https://vaaaaaanquish.hatenablog.com/entry/2020/04/29/202340

https://zenn.dev/shinsa82/articles/pep-440-overview