PDM构建时自动添加日期到SCM版本号导致TestPyPI发布失败,如何配置避免?
PDM构建时自动添加日期到SCM版本号导致TestPyPI发布失败,如何配置避免?
从你的描述来看,你用PDM结合Git SCM管理版本,构建时自动生成了带+d20250221的本地版本号0.1.2.dev1+d20250221,发布到TestPyPI时被拒绝——这是因为PyPI(包括TestPyPI)禁止发布带有本地版本标识符(即+后缀部分)的包,哪怕这个版本格式符合PEP 440规范。下面是具体的问题解析和解决方案:
为什么会出现这个问题?
- PDM的SCM版本逻辑:你在
pyproject.toml中配置了source = "scm",PDM默认会根据Git状态生成版本号:- 当你的Git工作目录不干净(有未提交修改),或者当前HEAD没有精确指向某个Tag时,PDM会自动添加本地版本后缀(比如
+d20250221,包含日期信息),用来标识这是一个非正的本地构建版本。 - 你看到的
0.1.2.dev1+d20250221就是这种情况的产物。
- 当你的Git工作目录不干净(有未提交修改),或者当前HEAD没有精确指向某个Tag时,PDM会自动添加本地版本后缀(比如
- PyPI的发布限制:虽然PEP 440允许本地版本格式,但PyPI官方明确不接受这类版本——因为本地版本是为本地测试/构建设计的,不具备全局唯一性,不适合公开发布。
解决方案
方案1:规范发布流程(推荐)
如果要正式发布到PyPI,最规范的做法是确保当前Git状态干净且精确指向目标Tag:
- 先检查Git工作目录,确保没有未提交的修改或未跟踪文件:
git status - 切换到你要发布的Tag上:
git checkout 0.1.2.dev1 - 确认当前提交就是Tag对应的版本:
git log --oneline -1 - 现在重新运行
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
相关产品推荐
相关产品推荐

