【问题标题】:Python Pip automatically increment version number based on SCMPython Pip 基于SCM自动递增版本号
【发布时间】:2023-02-10 03:16:58
【问题描述】:

类似的问题被多次提出,但我无法找到针对我的具体问题的解决方案。

我最近在玩setuptools_scm,一开始以为这正是我需要的。我把它配置成这样:

pyproject.toml

[build-system]
requires = ["setuptools_scm"]
build-backend = "setuptools.build_meta"

[project]
...
dynamic = ["version"]

[tool.setuptools_scm]
write_to = "src/hello_python/_version.py"
version_scheme = "python-simplified-semver"

和我的 __init__.py

from ._version import __version__
from ._version import __version_tuple__

它为我涵盖的相关功能:

  • 我可以使用语义版本控制
  • 它能够使用 *.*.*.devN 版本字符串
  • 如果是feature-branches,它会增加次要版本
  • 如果是fix-branches,它会增加补丁/微版本

这一切都很酷。只要我在我的feature-branch 上,我就能获得正确的版本字符串。

我特别喜欢的是,开发版本字符串包含提交哈希,因此在多个分支中是唯一的。

我的工作流程现在看起来像这样:

  • 创建featurefix分支
  • 提交,(推送,)发布
  • 将 PR 合并到 develop-branch

一旦我在我的 feature-branch 上,我就可以运行 python -m build,它根据找到的最新 git 标签生成一个新的 _version.py,其中包含正确的版本字符串。如果我添加新的提交,没问题,因为版本字符串的 devN 部分会因提交哈希而发生变化。我现在甚至可以运行python -m twine upload dist/*。我的包是用正确的版本构建的,所以我只是发布它。对于 fixfeature 分支机构,这在本地和 CI 上都非常有效。

我现在面临的问题是,对于合并的 PullRequests,我需要稍微不同的行为 一旦我合并,例如0.0.1.dev####,我不想再在feature-branch 上运行我的 Jenkins 作业,而是在develop-branch 上运行。现在重要的是,我想

  • 获取develop-branch(由 CI 完成)
  • 将版本字符串更新为与分支相同但没有 devN,因此:0.0.1
  • 构建和发布

事实上,setuptools_scm 现在正在将版本更改为 0.0.2.dev###,我想要 0.0.1。 在运行setuptools_scmbuild 之前,我对创建 git 标签进行了一些修改,但我无法获得正确的版本字符串以放入标签中。在这一点上,我现在正在挣扎。

有没有人知道解决我的问题的解决方案?:

  • feature-branches 上的小增量 + 添加 .devN
  • fix-branches 上的补丁/微增量 + 添加 .devN
  • develop-branch 没有增量,版本字符串只包含合并分支的 major.minor.patch

【问题讨论】:

    标签: python pip setuptools setuptools-scm


    【解决方案1】:

    我也是刚开始用setuptools_scm,所以对用起来还不是很有信心。

    但是,据我所知,派生版本号的逻辑是根据存储库的状态递增的(详细逻辑记录在此处:https://github.com/pypa/setuptools_scm/#default-versioning-scheme)。

    如果我没记错的话,该工具现在完全符合预期:它不会设置仅从标签派生的版本名称,还会添加一个 devSomething,因为您设置的标签没有引用最新的提交你的情况下的开发分支负责人。

    我还遇到了一个问题,当让 setuptools_scm 生成一个版本并将其配置为将其写入文件时,这将导致自上次提交以来的另一种状态,再次生成开发版本号。

    为了获得“干净”(例如 v0.0.1)版本号,我不得不在合并后(使用合并提交)进行标记,因为版本编号逻辑也考虑了合并提交。

    目前我的设置仍然没有你的复杂。只需功能和修复分支以及没有开发的主分支。更少的合并提交(我选择合并提交,所以没有线性历史)。现在合并提交后我手动创建一个标签并自己制定它。这也只对我有用,以防我选择退出将版本号写入文件。我通过将以下内容插入 pyproject.toml 来完成此操作:

    [tool.setuptools_scm]
    # intentionally empty/commented out
    # write_to option leads to an unclean workspace during build
    # which again is leading setuptools_scm to interpret this during build and producing wheels with unclean version numbers
    # write_to = "version.txt"
    

    不是完美的方法,一些手动步骤,但现在它对我有用。当然不是 100% 适用于您的 CI 场景,但也许您可以更改执行合并和标记的顺序。我希望这能以某种方式有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多