Python 歷時這麼久以來至今還未有一個事實上標準的專案管理及構建工具,以至於造成 Python 專案的結構與構建方式五花八門。這或許是體現了 Python 的自由意志。
不像 Java 在經歷了最初的手工構建,到半自動化的 Ant, 再到 Maven 基本就是事實上的標準了。其間 Maven 還接受了其他的 Gradle(Android 專案主推), SBT(主要是 Scala 專案), Ant+Ivy, Buildr 等的挑戰,但都很難撼動 Maven 的江湖地位,而且其他的差不多遵循了 Maven 的目錄佈局。
回到 Python,產生過 pip, pipenv, conda 那樣的包管理工具,但對專案的目錄佈局沒有任何約定。
關於構建很多還是延續了傳統的 Makefile 的方式,再就是加上 setup。py 和 build。py 用程式程式碼來進行安裝與構建。關於專案目錄佈局,有做成專案模板的,然後做成工具來應用專案模板。
下面大概瀏覽一下四個工具的使用
CookieCutter
PyScaffold
PyBuilder
Poetry
CookieCutter 一個經典的 Python 專案目錄結構
最後由 cookiecutter 生成的專案模板是下面的樣子:
這大概是當前比較流行的目錄結構的主體框架,主要元素是:
專案 sample 目錄中重複 sample 目錄中放置 Python 原始檔, 目錄中是測試檔案,再加一個 目錄放文件,README。rst, 其他的用於構建的 setup, setup。cfg 和 Makefile 檔案。
這其實是一個很經典的 Python 專案結構,接下來的構建就用 命令了,輸入 會看到定義在 Makefile 檔案中的指令
為使用上面的構建過程,需要安裝相應的包,如 , , , , , 它們都可以透過 來安裝。之後就可以 , , , 等。其中 可以生成一個很漂亮的 Web 文件。
PyScaffold 建立一個專案
PyScaffold 顧名思義,它是一個用來建立 Python 專案腳手架的工具,安裝和使用:
這樣建立了一個 Python 專案,目錄結構與前面 cookiecutter 所選的模板差不多,只不過它把原始檔放在了 目錄,而非 目錄。
能顯示出定義在 中所有的任務:
要執行哪個命令便用 , 等, 下面是如何使用 PyScaffold 的動圖:https://yanbin。blog/wp-content/uploads/2021/09/pyscaffold-demo。gif
PyBuilder
最好再看另一個構建工具 PyBuilder, 它所創建出的目錄結構很接近於 Maven, 下面來瞧瞧
完後看下它的目錄結構:
構建過程仍然是用 命令,可用 檢視幫助, 列出所有的任務, PyBuilder 的任務是以外掛的方式加入的,外掛配置在 檔案中。
PyBuilder 也是在構建或測試之前建立虛擬環境, 從 0。12。9 版開始可透過引數 跳過建立虛擬環境這一步。使用了 的話 Python 程式碼將會在執行 的當前 Python 環境中執行,所需的依賴將要手工安裝。
專案的依賴也要定義在 檔案中
隨後在執行 建立虛擬環境時就會安裝上面的依賴,並在其中執行測試與構建。
Poetry
最後一個 Poetry, 感覺這是一個更為成熟,專案活躍度也更高的 Python 構建,它有著更強大的信賴管理功能,用 就能新增依賴, 顯示出依賴樹。看下如何安裝及建立一個專案
它建立的專案比上面都簡單
如果給 帶上 引數,那麼原始檔目錄 會放在 目錄下,即 。
會在當前目錄中生成 檔案,目錄等的生成需手動完成。
它不關注文件的生成,程式碼規範的檢查,程式碼覆蓋率都沒有。它的專案配置更集中,全部在 檔案中, 是什麼呢?它是一種配置檔案的格式 Tom‘s Obvious, Minimal Language (https://github。com/toml-lang/toml)。
有些類似 NodeJS 的 檔案,比如 poetry add, poetry install 命令的行
其他主要的
能執行任何系統命令,只是它會在它要的虛擬環境中執行。所以可以想見, 的專案要生成文件或覆蓋率都必須用 命令來支援 , 或 。
在 sample 目錄(與 pyproject。toml 檔案平級)中建立檔案 , 內容為
然後在 中寫上
再執行
就會輸出 “hello poetry”。
透過對以上四個工具的認識,專案結構的複雜度由 cookiecutter-pyproject -> PyScaffold -> PyBuilder -> Poetry 依次降低,使用的難度大略也是相同的順序。
參考連結
Set up tests, linters and type checking in Python projects in 2020 (https://medium。com/@cristobalcl/set-up-tests-linters-and-type-checking-in-python-projects-in-2020-9cc1b1e2750d) (介紹了 poetry 專案如何支援 coverage, lint 和 type checking)
Dependency management tools for Python (https://snyk。io/blog/dependency-management-tools-python/)
連結:https://yanbin。blog/python-dependency-management-build-tools