背景#
如果你计划将 Python 项目发布到 PyPI,就需要了解 PyPI 与 pip 的版本安装规则。
我做了一些关于 pip install
的测试,来观察不同版本号和 --upgrade
参数下的安装行为。
假设我的项目叫 demo-pip:
- Beta 版本号示例:
1.1.0.xxxx
- 正式版本号示例:
1.1.0
目标是确认在不同情况下是否能成功升级。
总结#
- 安装 PyPI 上的指定版本(无论是否加
--upgrade
)都会成功。 - 当 PyPI 上的版本高于本地版本时,只有加
--upgrade
才会成功升级;不加则失败。 - 当 PyPI 上的版本低于本地版本时,无论是否加
--upgrade
,都会失败。 - 使用
1.1.0.xxxx
作为 beta 版本号在 pip 中是合法的,但如果 beta 版本号大于正式版本(例如1.1.0.1000
),在发布正式版本1.1.0
后,--upgrade
将无法降级安装。- 方案 A:正式版本从
1.1.0.1000
开始,beta 版本从1.1.0.0001
递增。 - 方案 B(推荐):遵循 PEP 440 官方版本规范,beta 版本命名为
1.1b1
,1.1b2
…(测试结果正常工作)。
- 方案 A:正式版本从
- 按 PEP 440 命名的 beta 版本(如
1.0b1
)被视为小于正式版本,因此升级逻辑正常。
测试案例#
No. | 测试步骤 | 结果 | 结论 |
---|---|---|---|
1 | 安装本地 1.0.5 → PyPI 最新是 1.0.4 → pip install --upgrade | 已是最新,无法降级 | 低版本无法覆盖高版本 |
2 | 安装本地 1.0.3 → pip install --upgrade (PyPI: 1.0.4 ) | 升级成功 | 高版本可覆盖低版本(需 --upgrade ) |
3 | 安装本地 beta 1.0.3.1000 → pip install / --upgrade | 无 --upgrade 不升级,有则升级 | 大版本比较逻辑生效 |
4 | 安装本地 beta 1.0.4.1000 → pip install 1.0.4 | 降级失败(版本比较更大) | beta 高于正式版时降级失败 |
5 | 安装本地 beta 1.0b1 → pip install --upgrade (PyPI: 1.0.4 ) | 升级成功 | PEP 440 命名可正常比较版本 |
建议#
- 优先遵循 PEP 440:这样可以保证 pip 对 beta、rc、final 等版本的比较符合预期。
- 在 CI/CD 中明确使用
--upgrade
逻辑,避免不必要的安装失败。 - 对 beta 与正式版本的发布顺序做好规划,避免版本号反转导致的降级问题。