Python打包的發展歷程

2020-07-16 10:05:04
Python 打包一開始可能有些難以理解,其主要原因是不了解建立 Python 包的正確工具。但不管怎樣,一旦建立好第一個包,就會發現其實它並沒有想象的那麼難。

即便你對將程式碼開源分發不感興趣,也應該知道如何建立一個完整的包,因為這可以讓你深入了解打包生態系統,有助於使用 PyPI 上可用的第三方程式碼。此外,將閉源專案或者其元件程式設計原始碼發行包,有助於你在不同的環境中部署程式碼。

Python打包的混亂狀態

Python 打包曾經在很長一段時間內處於混亂不堪的狀態,人們花了很多年才使其重新變得有組織。

一切都從 1998 年引入的 distutils 包開始,隨後在 2003 年對 setuptools 進行改進,這兩個專案開啟了一段漫長而又糾結的故事,包括派生(fork),替代專案與完全重新編寫,都想要徹底修復 Python 的打包生態系統。

然而不幸的是,大部分嘗試非但沒有成功,每個想要取代 setuptools 或 distutils 的新專案都只是給打包工具十分混亂的狀態添亂而己。其中,有些派生被合併回它們的祖先中(例如 setuptools 派生的 distribute),有些則直接被棄用(distutils2)。

這種混亂的狀態直到成立了被稱為 Python Packaging Authority(簡稱 PyPA)的組織,將秩序和組織性帶回到打包生態系統中。PyPA 維護的 Python 打包使用者指南(Python Packaging User Guide)是關於最新打包工具和最佳實踐的權威資訊來源。

這份指南包含詳細的歷史變化以及與打包相關的新專案,因此,如果你已經了解一些內容,但想要確保使用的是正確的工具,那麼這份指南是很有用的。

Python打包的現狀

PyPA 除了提供一份權威的打包指南之外,還維護著打包專案與新的官方打包的標準化過程,前面章節中己經提到過其中一些專案,最有名的例如 pip、virtualenv、twine 和 warehouseo。

有興趣的讀者可參閱 PyPA 官方網站做詳細了解。

注意,其中大部分專案都是在這個組織之外開始的,只是作為一個成熟且廣泛使用的解決方案遷移到 PyPA 下而已。

由於 PyPA 的參與,構建發行版已經正在逐步棄用 egg 格式,而是支援使用 wheel 格式,未來可能會帶來全新的方法。另外,PyPA 正在積極開發 warehouse,其目的是完全替代當前的 PyPI 實現,這將是打包歷史上邁出的一大步,因為 PyPI 是如此古老且被忽視的專案。

PyPA打包工具推薦

Python 打包使用者指南有關使用包的推薦工具給出了一些建議。這些工具大體可分為兩組,分別是用於安裝包的工具和用於包的建立與分發的工具。

PyPA 推薦用於安裝包的工具:
  • 使用 pip 安裝來自 PyPI 的包。
  • 將 virtualenv 或 venv 用於 Python 環境的應用級隔離。

PyPA 推薦包的建立與分發的工具如下:
  • 使用 setuptools 來定義專案並建立原始碼發行版。
  • 使用 wheel 而不是 egg 來構建發行版。
  • 使用 twine 向 PyPI 上傳包的發行版。