不使用setup.py,打包 Python 項目

不使用setup.py,打包 Python 項目

我編寫了許多開源項目,並允許其他人通過PyPI訪問這些項目。為此,我需要從這些項目構建一個源代碼分發版(sdist)和一個可選的wheel包,並將二者上傳到PyPI。最後,這個sdist和wheel包必須要能通過pip進行安裝,以便其他人使用。

我的大多數項目使用setuptools(通過一個setup.py)進行打包,因為這是長久以來實現此目的的(唯一)方法,但是,最近的兩個PEP(517和518)允許我們開發新的工具。最值得注意的是,這些新工具使用了一個pyproject.toml文件,你可以在這篇文章中瞭解有關它的更多信息。

一段時間以來,我一直在使用這些新工具中的一種,Poetry,來管理我的應用程序。最初,我這樣做是受Poetry's的文件鎖支持所鼓舞的,它優於我之前使用的requirements-to-freeze系統。還有一個原因是poetry允許執行腳本,比如poetry run test,我在這篇文章中解釋過。

因為我喜歡在我的應用程序中使用Poetry,所以我想我應該在我的一個庫(Quart- Auth)上嘗試一下,Quart- Auth是Quart的一個身份驗證管理擴展。這是我正在實驗的一些東西,但是我已經對下面的設置很滿意了。

Setup.py 設置

由於我的項目是純python的(沒有用c代碼來編譯),構建要簡單得多,唯一的複雜之處是我希望按照PEP 561包含一個py.typed文件。我的設置需要一個MANIFEST.in和一個 setup.py,並且關鍵的是使用check-manifest工具和python setup.py check來確保一切都是正確的。

來自Quart-Rate-Limiter的一個示例setup.py文件(精簡至關鍵部分)是,

不使用setup.py,打包 Python 項目

一個示例MANIFEST.in文件(同樣進行了精簡) 是:

不使用setup.py,打包 Python 項目

Setup.py 發佈過程

要構建sdist、wheel並將其推送到PyPI,一個安裝了setuptools、whee和twine的環境是必需的。然後你就可以使用以下命令去構建和上傳,

不使用setup.py,打包 Python 項目

Poetry 設置

Poetry包含了一個方便的命令來允許你使用poetry new從頭設置一個項目或者使用poetry init在現有的項目中設置一個項目。這個命令會創建pyproject.toml文件,其中包含了繼續進行項目所需的足夠的信息。對於Quart-Auth,我添加了一個分類器列表、存儲庫url、依賴項(包括用於開發的tox),並指出py.typed文件應該在構建包中,請在這裡查看該文件。

不使用setup.py,打包 Python 項目

就我所知,這就是所有需要設置的東西。我們現在就可以使用poetry構建Quart-Auth了。

Poetry發佈

要構建sdist、wheel並將其推送到PyPI,一個安裝了poetry和wheel的環境是必需的。然後你就可以使用以下命令去構建和上傳,

不使用setup.py,打包 Python 項目

補充:包版本用法

通常情況下,例如在Quart & Flask中,版本存儲在源代碼中,該代碼會在setup.py中被加載或解析。

不使用setup.py,打包 Python 項目

這就允許庫用戶以編程方式查詢版本(例如
quart.__about__.__version__)。這在poetry設置中顯然是不可能的,但是在Python3.8中有一個更好的解決方案,

不使用setup.py,打包 Python 項目

一個示例用法是當你在構建Quart-Auth文檔的時候。

結論

只使用pyproject和poetry而不使用setuptools有一個重要的缺點,那就是可編輯安裝,例如,pip install -e ..在沒有shim的情況下是不可能執行的,看看這個討論。這就暫時排除了在我所維護的Quart 和 Hypercorn項目中使用Poetry的可能性。

切換到poetry和pyproject.toml就意味著我距離為我的項目設置一個更簡單、更清晰的配置這個目標更近了一步,即pyproject.toml中的所有東西。當我有時間的時候,我可能會轉移更多的項目。

英文原文:https://pgjones.dev/blog/packaging-without-setup-py-2020/
譯者:一瞬不使用setup.py,打包 Python 項目


分享到:


相關文章: