可能你已經有所了解,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章 延伸閱讀
- 版權信息
- 版權聲明
- 歡迎來到異步社區!
- 異步社區的來歷
- 社區里都有什么?
- 購買圖書
- 下載資源
- 與作譯者互動
- 靈活優惠的購書
- 紙電圖書組合購買
- 社區里還可以做什么?
- 提交勘誤
- 寫作
- 會議活動早知道
- 加入異步