如何向PyPI上傳Python程式包?

2020-07-16 10:05:01
對於 Python 包而言,如果沒有有組織的儲存、上傳和下載方式,那麼它是沒有用的。Python 包索引(一個搜尋下載包的平台)是 Python 社群開源包的主要來源,任何人都可以免費上傳新的包,唯一的要求就是在 PyPI 網站上進行註冊。

當然,我們不必局限於這個索引,而且所有打包工具都支援使用其他包倉庫。對於在內部組織分發或為了開發目的而分發的閉原始碼來說,這一點特別有用。

本節,主要解決如何向 PyPI 上傳程式包,同時還會簡單介紹一下指定其他倉庫的方法。

如前所述,PyPI 是開源包發行版的官方來源。從 PyPI 下載不需要任何賬號或者許可權,唯一需要的是一個包管理器,可以從 PyPI 下載新的發行版,而首選應該是 pip。

上傳到PyPI或其他包索引

任何人都可以註冊並向 PyPI 上傳包,只要有註冊賬號就行。包與使用者系結,預設情況下只有註冊了包名稱的使用者是它的管理員,並且可以上傳新的發行版。但對於大型專案來說,有一個選項可以指定其他使用者作為包的維護者,以便他們能夠上傳新的發行版。

上傳包的最簡單方法就是使用 setup.py 指令碼的 upload 命令:

$ python setup.py <dist-commands> upload

這裡的 <dist-commands> 是建立要上傳的發行版的命令列表,只有在相同的 setup.py 執行期間建立的發行版才會被上傳到倉庫中。

因此,如果想要同時上傳原始碼發行版、構建發行版和 wheel 包,可以使用下列命令:

$python setup.py sdist bdist bdist_wheel upload

注意,使用 setup uplod 的方式有以下 2 個問題:
  1. 使用 setup.py 進行上傳時,不能重複使用已經構建的發行版,每次上傳時都必須重新構建,這對於大型專案或複雜專案來說很不方便,因為建立發行版需要相當長的時間。
  2. 在某些 Python 版本中,它可以使用純文字 HTTP 連線或未驗證的 HTTPS 連線。

這裡推薦大家使用 twine 作為 setup.py upload 的安全替代。twine 是與 PyPI 互動的實用程式,目前只有一個作用,就是將包安全地上傳到倉庫中。twine 支援任何打包格式,並始終確保連線安全,它還允許上傳已經建立的檔案,這樣能夠在發布之前對發行版進行測試。

twine 的一個範例用法仍然需要呼叫 setup.py 來構建發行版,如下所示:

$ python setup.py sdist bdist_wheel
$ twine upload diat/*

注意,在上傳之前一定要註冊賬號,否則上傳會失敗。當然,也可以使用 twine 來完成註冊,如下所示:

$ twine register dist/*

.pypirc組態檔

.pypirc 是一個組態檔,其中儲存有關 Python 包倉庫的資訊,應位於包的主目錄中。該檔案的格式如下所示:

[distutils]
index-servers =
pypi
other

[pypi]
repository: <repository-url>
username: <username>
password: <password>

[other]
repository: https://example.com/pypi
username: <username>
password: <password>

其中,distutils 欄位應該包含 index-servers 變數,其中列出描述所有可用倉庫及其證書的所有區段。每個倉庫區段中只能修改下面這 3 個變數:
  1. repository:包倉庫的 URL,預設是 https://www.python.org/pypi;
  2. username:給定倉庫中授權的使用者名稱;
  3. password:明文的授權使用者密碼。

注意,明文儲存倉庫密碼可能並不安全,我們可以一直將其空這,必要時再提示輸入。

所有為 Python 構建的打包工具都應該遵守 .pypirc 檔案。雖然不是每個打包相關的實用程式都滿足這一要求,但大多數重要的實用程式都支援這一點,例如 pip、twine、distutils 和 setuptools。