如何使用发布分支使用 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
出现的版本是正确的
然后我分支
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',
},
)
分支 main
和 v0.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.1
、release-0.1
),则补丁版本会增加。
如果您在 main
或功能分支上,则次要版本会发生变化。
标签名称和分支名称不应完全相同。
发布分支名称通常只包含次要版本:
git checkout -b v0.1
pip-tools + setuptools_scm
由于setup.cfg
在setup_requires
中只有setuptools_scm
而没有install_requires
,pip-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
参考文献:
- https://github.com/jazzband/pip-tools/issues/825
- https://github.com/jazzband/pip-tools#workflow-for-layered-requirements
发布版本
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
我在看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
出现的版本是正确的
然后我分支
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',
},
)
分支 main
和 v0.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.1
、release-0.1
),则补丁版本会增加。
如果您在 main
或功能分支上,则次要版本会发生变化。
标签名称和分支名称不应完全相同。
发布分支名称通常只包含次要版本:
git checkout -b v0.1
pip-tools + setuptools_scm
由于setup.cfg
在setup_requires
中只有setuptools_scm
而没有install_requires
,pip-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
参考文献:
- https://github.com/jazzband/pip-tools/issues/825
- https://github.com/jazzband/pip-tools#workflow-for-layered-requirements
发布版本
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