You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PDM构建时自动添加日期到SCM版本号导致TestPyPI发布失败,如何配置避免?

PDM构建时自动添加日期到SCM版本号导致TestPyPI发布失败,如何配置避免?

从你的描述来看,你用PDM结合Git SCM管理版本,构建时自动生成了带+d20250221的本地版本号0.1.2.dev1+d20250221,发布到TestPyPI时被拒绝——这是因为PyPI(包括TestPyPI)禁止发布带有本地版本标识符(即+后缀部分)的包,哪怕这个版本格式符合PEP 440规范。下面是具体的问题解析和解决方案:

为什么会出现这个问题?

  1. PDM的SCM版本逻辑:你在pyproject.toml中配置了source = "scm",PDM默认会根据Git状态生成版本号:
    • 当你的Git工作目录不干净(有未提交修改),或者当前HEAD没有精确指向某个Tag时,PDM会自动添加本地版本后缀(比如+d20250221,包含日期信息),用来标识这是一个非正的本地构建版本。
    • 你看到的0.1.2.dev1+d20250221就是这种情况的产物。
  2. PyPI的发布限制:虽然PEP 440允许本地版本格式,但PyPI官方明确不接受这类版本——因为本地版本是为本地测试/构建设计的,不具备全局唯一性,不适合公开发布。

解决方案

方案1:规范发布流程(推荐)

如果要正式发布到PyPI,最规范的做法是确保当前Git状态干净且精确指向目标Tag:

  1. 先检查Git工作目录,确保没有未提交的修改或未跟踪文件:
    git status
    
  2. 切换到你要发布的Tag上:
    git checkout 0.1.2.dev1
    
  3. 确认当前提交就是Tag对应的版本:
    git log --oneline -1
    
  4. 现在重新运行pdm build,生成的版本号会是纯0.1.2.dev1,没有+后缀,再执行pdm publish就能正常发布了。

方案2:强制PDM不生成本地版本后缀

如果是测试场景,不想严格遵循Tag发布流程,可以修改pyproject.toml的版本配置,禁用本地版本生成:
修改你[tool.pdm]下的version配置,添加local_scheme = "no-local-version":

[tool.pdm]
distribution = true
version = {
  source = "scm",
  write_to = "ff_testpkg/version.py",
  write_template = "__version__ = '{}'",
  local_scheme = "no-local-version"
}

修改后,无论Git状态如何,PDM构建时都会只生成公开版本部分(0.1.2.dev1),不会添加+后缀,这样就能通过PyPI的版本校验了。

对你疑问的补充

你提到根据Packaging Python Docs,0.1.2.dev1+d20250221这种格式是允许的——这一点没错,但PyPI有额外的政策限制:它只接受“公开版本标识符”,不允许任何带有+的本地版本,所以即使格式合法,也会被拒绝。

备注:内容来源于stack exchange,提问作者fishfin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 11:13:01