如何使用发布分支使用 setuptools_scm 来增加版本?

how to use release branch to increment version using setuptools_scm?

我在看https://github.com/pypa/setuptools_scm

我读了这部分 https://github.com/pypa/setuptools_scm#version-number-construction

我引用

Semantic versioning for projects with release branches. The same as guess-next-dev (incrementing the pre-release or micro segment) if on a release branch: a branch whose name (ignoring namespace) parses as a version that matches the most recent tag up to the minor segment. Otherwise if on a non-release branch, increments the minor segment and sets the micro segment to zero, then appends .devN.

这是如何工作的?

假设我的设置是在这个提交 https://github.com/simkimsia/test-setup-py/commit/5ebab14b16b63090ad0554ad8f9a77a28b047323

和相同的 repo,我如何通过分支来增加版本?

我在 2022-03-15 尝试过的

我更新了主分支上的一些文件。

然后我做了以下

python -m pip install --upgrade "pip ~= 21.3"

pip install pip-tools "pip-tools ~= 6.5"

git init .

git add .
git commit -m '♻️ REFACTOR'
git tag -a v0.0.0 -m ' First tag v0.0.0'

pip-compile

pip-sync

pip install -e .

然后我推送我的更改,包括标签

所以这次提交是 https://github.com/simkimsia/test-setup-py/commit/75838db70747fd06cc190218562d0548baa16e9d

当我运行python -m demopublicpythonproject出现的版本是正确的

此处出现的版本号是基于https://github.com/simkimsia/test-setup-py/blob/75838db70747fd06cc190218562d0548baa16e9d/demopublicpythonproject/framework/__init__.py#L14

然后我分支

git checkout -b v0.0.1

然后我添加了一个pyproject.toml并设置为release-branch

# pyproject.toml
[build-system]
requires = ["setuptools>=45", "setuptools_scm[toml]>=6.2"]
version_scheme = "release-branch-semver"

https://github.com/simkimsia/test-setup-py/blob/v0.0.1/pyproject.toml

然后我运行

python -m setuptools_scm

我明白了

/Users/kimsia/.venv/test-setup-py-py3812/bin/python: No module named setuptools_scm

无论如何我运行以下

pip-compile

pip-sync

pip install -e .

git commit -m 'Attempt to do branch semver'

然后我有这个提交结果 https://github.com/simkimsia/test-setup-py/commit/527885531afe37014dc66432a43a402ec0808caa

当我 运行 python -m demopublicpythonproject 我得到这张图片

根据分支号,版本似乎遵循但我可能是错的,因为最新的标签是 v0.0.0

所以我

git checkout -b main
git checkout -b v0.1.0
pip-sync
pip install -e .      
python -m demopublicpythonproject

我得到一个不同的版本号

0.0.1.dev1+g45f5696 但不是 0.1.0

如果我没有正确阅读文档,这可能意味着您应该像这样创建分支(假设您当前的版本是 0.x):

main (main development branch)
1.0 (release branch for 1.0)
2.0 (development branch for 2.0)

我的理解是这样解析的:

文档说

Semantic versioning for projects with release branches. The same as guess-next-dev (incrementing the pre-release or micro segment) if on a release branch: a branch whose name (ignoring namespace) parses as a version that matches the most recent tag up to the minor segment. Otherwise if on a non-release branch, increments the minor segment and sets the micro segment to zero, then appends .devN.

所以我对此的理解是:

您想制作一个新版本。所以你把它放在一个名为 2.0 的分支上。由于程序知道您的上一个版本是 2.0.0,因此您的新版本将被称为 2.0.1

基本上,它 auto-increments 您的版本标签上的微型版本。

可以通过在pyproject.toml中设置对应的variable来更改版本方案:

[tool.setuptools_scm]
version_scheme = "release-branch-semver"

然后您可以创建带有 SemVer 名称的分支来增加版本号。例如:

$ git tag 
v1.0.0
$ git checkout main 
Already on 'main'
$ python -m setuptools_scm
1.1.0.dev1+gdaf07ef
$ git checkout -b 1.0.1
Switched to a new branch '1.0.1'
$ python -m setuptools_scm
1.0.1.dev1+gdaf07ef

如果您使用的是setup.py,您可以按以下方式配置它:

setup(
    use_scm_version={
        'version_scheme': 'release-branch-semver',
    },
)

分支 mainv0.1.0 没有 pyproject.toml,因此您需要添加该文件。

version_scheme 应该在 [tool.setuptools_scm] 下面而不是 [build-system]:

# pyproject.toml
[build-system]
requires = ["setuptools>=45", "setuptools_scm[toml]>=6.2"]

[tool.setuptools_scm]
version_scheme = "release-branch-semver"

这会给你 0.1.0.dev1+g45f5696.

您可以在本地查看版本号:

python setup.py --version

发布分支

git checkout -b main
git checkout -b v0.1.0

如果您在发布分支上(例如 v0.1release-0.1),则补丁版本会增加。

如果您在 main 或功能分支上,则次要版本会发生变化。

标签名称和分支名称不应完全相同。
发布分支名称通常只包含次要版本:

git checkout -b v0.1

pip-tools + setuptools_scm

由于setup.cfgsetup_requires中只有setuptools_scm而没有install_requirespip-compile(没有选项)不会编译成requirements.txt 和 pip-sync 将卸载 setuptools-scm,因此您必须在 pip-sync 之后 pip install setuptools_scm

或者,您可以将 setup = setuptools_scm 添加到 [options.extras_require]:

# setup.cfg
...

[options]
setup_requires = setuptools_scm
...

[options.extras_require]
setup = setuptools_scm

用法:

pip-compile --extra setup -o setup-requirements.txt

pip-sync setup-requirements.txt

参考文献:

发布版本

setuptools_scm主要生成开发版和post-release版。

要生成像 0.1.0 这样的发布版本,您可以将可调用项传递给 use_scm_version:

# content of setup.py

def myversion():
    from setuptools_scm.version import SEMVER_MINOR, guess_next_simple_semver, release_branch_semver_version

    def my_release_branch_semver_version(version):
        v = release_branch_semver_version(version)
        if v == version.format_next_version(guess_next_simple_semver, retain=SEMVER_MINOR):
            return version.format_next_version(guess_next_simple_semver, fmt="{guessed}", retain=SEMVER_MINOR)
        return v

    return {
        'version_scheme': my_release_branch_semver_version,
        'local_scheme': 'no-local-version',
    }


setup(use_scm_version=myversion)

参考:https://github.com/pypa/setuptools_scm#importing-in-setuppy