可能你已经有所了解,Python生态系统正在对包的元数据进行标准化。其中一项元数据就是版本号。
PEP 440(<http://www.python.org/dev/peps/pep-0440/>)针对所有的Python包引入了一种版本格式,并且在理论上所有的应用程序都应该使用这种格式。这样,其他的应用程序或包就能简单而可靠地识别它们需要哪一个版本的包。
PEP440中定义版本号应该遵从以下正则表达式的格式:
`N[.N]+[{a|b|c|rc}N][.postN][.devN]`它允许类似1.2或1.2.3这样的格式,但需注意以下几点。
- 1.2等于1.2.0,1.3.4等于1.3.4.0,以此类推。
- 与N\[.N\]+相匹配的版本被认为是**最终版本**。
- 基于日期的版本(如2013.06.22)被认为是无效的。针对PEP440格式版本号设计的一些自动化工具,在检测到版本号大于或等于1980时就会抛出错误。
最终即将发布的组件也可以使用下面这种格式。
- N\[.N\]+aN(如1.2a1)表示一个**alpha**版本,即此版本不稳定或缺少某些功能。
- N\[.N\]+bN(如2.3.1b2)表示一个**beta**版本,即此版本功能已经完整,但可能仍有bug。
- N\[.N\]+cN或N\[.N\]+rcN(如0.4rc1)表示**候选版本**(常缩写为RC),通常指除非有重大的bug,否则很可能成为产品的最终发行版本。尽管*rc*和*c*两个后缀含义相同,但如果二者同时使用,*rc*版本通常表示比*c*更新一点。
通常用到的还有以下这些后缀。
- .postN(如1.4.post2)表示一个**后续版本**。通常用来解决发行过程中的细小问题(如发行文档有错)。如果发行的是bug修复版本,则不应该使用*.postN*而应该增加小的版本号。
- .devN(如2.3.4.dev3)表示一个**开发版本**。因为难以解析,所以这个后缀并不建议使用。它表示这是一个质量基本合格的发布前的版本,例如,2.3.4.dev3表示2.3.4版本的第三个开发版本,它早于任何的alpha版本、beta版本、候选版本和最终版本。
这一结构可以满足大部分常见的使用场景。
>注意
> 你可能已经听说过语义版本(<http://semver.org/>),它对于版本号提出了自己的规则。这一规范和PEP 440部分重合,但二者并不完全兼容。例如,语义版本对于预发布版本使用的格式*1.0.0.-alpha+001*就与PEP 440不兼容。
如果需要处理更高级的版本号,可以考虑一下PEP 426([http://www.python.org/dev/ peps/pep-0426](http://www.python.org/dev/peps/pep-0426))中定义的**源码标签**,这一字段可以用来处理任何版本字符串,并生成同PEP要求一致的版本号。
许多分布式版本控制系统(Distributed Version Control System,DVCS)平台,如Git和Mercurial,都可以使用唯一标识的散列字符串[①](#anchor11)作为版本号。但遗憾的是,它不能与PEP 440中定义的模式兼容:问题就在于,唯一标识的散列字符串不能排序。不过,是有可能通过源码标签这个字段维护一个版本号,并利用它构造一个同PEP 440兼容的版本号的。
>提示
> **pbr**(即Python Build Reasonableness,<https://pypi.python.org/pypi/pbr>)将在6.2节中讨论,它可以基于项目的Git版本自动生成版本号。
- 内容提要
- 中文版序
- 前言
- 第1章 项目开始
- 1.1 Python版本
- 1.2 项目布局
- 1.3 版本编号
- 1.4 编码风格与自动检查
- 1.5 Joshua Harlow访谈
- 第2章 模块和库
- 2.1 导入系统
- 2.2 标准库
- 2.3 外部库
- 2.4 框架
- 2.5 Doug Hellmann访谈
- 第3章 管理API变化
- Christophe de Vienne访谈
- 第4章 时区陷阱
- 第5章 文档
- 5.1 Sphinx和reST入门
- 5.2 Sphinx模块
- 5.3 扩展Sphinx
- 第6章 分发
- 6.1 简史
- 6.2 使用pbr打包
- 6.3 Wheel格式
- 6.4 包的安装
- 6.5 和世界分享你的成果
- 6.6 Nick Coghlan访谈
- 6.7 入口点
- 6.7.1 可视化的入口点
- 6.7.2 使用控制台脚本
- 6.7.3 使用插件和驱动程序
- 第7章 虚拟环境
- 第8章 单元测试
- 8.1 基础知识
- 8.2 fixture
- 8.3 模拟(mocking)
- 8.4 场景测试
- 8.5 测试序列与并行
- 8.6 测试覆盖
- 8.7 使用虚拟环境和tox
- 8.8 测试策略
- 8.9 Robert Collins访谈
- 第9章 方法和装饰器
- 9.1 创建装饰器
- 9.2 Python中方法的运行机制
- 9.3 静态方法
- 9.4 类方法
- 9.5 抽象方法
- 9.6 混合使用静态方法、类方法和抽象方法
- 9.7 关于super的真相
- 第10章 函数式编程
- 10.1 生成器
- 10.2 列表推导
- 10.3 函数式函数的函数化
- 第11章 抽象语法树
- 11.1 用抽象语法树检查来扩展flake8
- 11.2 Hy
- 11.3 Paul Tagliamonte访谈
- 第12章 性能与优化
- 12.1 数据结构
- 12.2 性能分析
- 12.3 有序列表和二分查找
- 12.4 namedtuple和slots
- 12.5 memoization
- 12.6 PyPy
- 12.7 通过缓冲区协议实现零复制
- 12.8 Victor Stinner访谈
- 第13章 扩展与架构
- 13.1 多线程的注意事项
- 13.2 多进程与多线程
- 13.3 异步和事件驱动架构
- 13.4 面向服务架构
- 第14章 RDBMS和ORM
- 14.1 用Flask和PostgreSQL流化数据
- 14.2 Dimitri Fontaine访谈
- 第15章 Python 3支持策略
- 15.1 语言和标准库
- 15.2 外部库
- 15.3 使用six
- 第16章 少即是多
- 16.1 单分发器
- 16.2 上下文管理器
- 第17章 延伸阅读
- 版权信息
- 版权声明
- 欢迎来到异步社区!
- 异步社区的来历
- 社区里都有什么?
- 购买图书
- 下载资源
- 与作译者互动
- 灵活优惠的购书
- 纸电图书组合购买
- 社区里还可以做什么?
- 提交勘误
- 写作
- 会议活动早知道
- 加入异步