Python 專案及依賴管理工具技術選型

曾左發表於2024-08-29

Python 專案及依賴管理工具,類似於 Java 中的 Maven 與 Node 中的 npm + webpack,在開發和維護專案時起著重要的作用。使用適當的依賴管理工具可以顯著提高開發效率,減少依賴衝突,確保專案的穩定性、可靠性和安全性。

一、常見專案及依賴管理工具需具備的功能

1. 依賴管理

(1)自動化依賴安裝

依賴管理工具可以自動安裝專案所需的所有依賴包,而不需要手動逐個安裝。

(2)依賴版本控制

這些工具允許開發者指定和鎖定依賴包的版本,確保專案在不同環境中執行時依賴的一致性

2. 虛擬環境管理

虛擬環境允許在同一臺機器上執行多個專案,而不會發生依賴衝突。依賴管理工具通常會自動建立和管理虛擬環境,確保專案依賴的隔離性。

3. 依賴衝突解決

依賴管理工具可以自動解決依賴衝突,確保安裝的依賴包版本相容。例如,pipenvpoetry 都有內建的依賴衝突解決機制。

4. 安全性檢查

一些工具(如 pipenv)提供了內建的安全性檢查功能,可以掃描依賴包的已知漏洞,並提供修復建議。

# 使用 pipenv 進行安全性檢查
pipenv check

5. 專案初始化和模板

一些工具(如 poetryhatch)提供了專案模板和腳手架功能,幫助開發者快速建立新專案。

6. 釋出依賴包

一些工具(如 poetry)內建了包釋出功能,可以方便地將專案釋出到 PyPI(Python Package Index)。

# 使用 poetry 釋出包
poetry publish --build

7. 生成依賴配置檔案

部分依賴管理工具可以生成描述專案依賴的檔案,方便團隊協作和部署。例如,pip-tools 可以生成 requirements.txt 檔案。

8. 版本管理

這是指如何管理和控制你的專案版本。每次釋出新版本時,你需要更新專案的版本號(如從 1.0.0 到 1.1.0),並確保版本號的變化遵循一定的規則(如語義化版本控制)。

版本管理工具可以幫助你自動更新版本號、生成變更日誌、建立釋出標籤等。

二、常見工具及其技術對比

常見 Python 專案及依賴管理工具,包括 PipenvPoetryCondaPip-toolsHatch)和 venv。以下從工具簡介、特性介紹、功能對比及流行度三方面進行對比。

1. 工具簡介

(1)Pipenv

Pipenv 一度被官方推薦為 Python 專案的依賴管理工具,尤其是在需要自動管理虛擬環境和依賴鎖定的場景中。然而,隨著時間的推移,它的熱度有所下降。

(2)Poetry

Poetry 近年來越來越流行,尤其在需要現代化依賴管理和包釋出的專案中。它提供了更好的使用者體驗和更強大的功能。

(3)Conda
Conda 在資料科學和機器學習領域非常流行,因為它不僅支援 Python,還支援 R 和其他語言,並且其環境管理功能非常強大。

(4)Pip-tools

Pip-tools 在一些需要精確控制依賴版本的專案中很受歡迎,尤其是那些仍然使用 requirements.txt 的專案。

(5)Hatch

Hatch 是一個相對較新的工具,雖然功能強大,但目前還沒有達到 PoetryConda 的流行度。

(6)venv

venv 是 Python 標準庫中的模組,用於建立輕量級的虛擬環境,方便專案間的依賴隔離。

2. 特性介紹

工具 主要使用場景 主要特性
Pipenv 一般專案,自動管理虛擬環境 自動建立和管理虛擬環境、依賴鎖定檔案(Pipfile.lock)、友好的 CLI 介面
Poetry 現代化專案,依賴管理和包釋出 全面的依賴管理、內建虛擬環境管理、專案構建和釋出、依賴解析和鎖定
Conda 資料科學和機器學習 跨語言支援、強大的環境管理、包管理、支援多種平臺(Windows, macOS, Linux)
Pip-tools 精確控制依賴版本的專案 生成和更新 requirements 檔案、依賴鎖定、與 pip 相容
Hatch 現代化專案管理和版本控制 專案模板、環境管理、版本控制、依賴管理、靈活的外掛系統
venv 基本虛擬環境管理 Python 內建模組,輕量級虛擬環境管理

3. 功能對比

功能 venv Pipenv Poetry Conda Pip-tools Hatch
建立虛擬環境
自動管理虛擬環境
依賴檔案
版本鎖定
安全性檢查
包釋出
依賴衝突解決
專案模板和腳手架
版本管理

4. 流行度

當前(2024 年 7 月 30 日)各工具流行度,如下:

工具 GitHub Stars PyPI 近半年下載量(萬) Forks Open Issues Open PRs
Pipenv 24k+ 6466 1862 260 14
Poetry 30k+ 20502 2236 602 74
Conda 6k+ 97 N/A N/A N/A
Pip-tools 7k+ 7254 608 160 27
Hatch 5k+ 1163 285 239 26
venv Python 內建 N/A N/A N/A N/A

三、結論

從上述技術對比來看,無論是功能特性還是流程程度,Poetry 都是當前最適合新 Python 專案的依賴管理工具。不過,部分其他工具也有一定適用場景,如 Pip-tools 適用於有 requirements 的老專案,Conda 適用於多程式語言專案。

四、VS pip

以 poetry 為例,簡要介紹上述專案及包依賴管理工具與 pip 的區別。 pip 是一個輕量級的包管理工具,適合簡單的包安裝和管理任務。 poetry 是一個功能強大的專案管理工具,適合需要全面管理專案依賴和配置的場景。

1. 功能對比

特性 pip poetry
功能和用途 pip 是 Python 的包管理工具,用於安裝和管理 Python 包。主要用於從 Python Package Index (PyPI) 下載和安裝包,不涉及專案管理。 poetry 是一個全面的 Python 專案管理工具,不僅可以安裝和管理包,還可以建立和管理專案、處理依賴關係、釋出包等。
配置檔案 pip 使用 requirements.txt 檔案來列出專案的依賴包。requirements.txt 是一個簡單的文字檔案,列出所有需要安裝的包及其版本。 poetry 使用 pyproject.toml 檔案來管理專案的後設資料和依賴關係。pyproject.toml 是一個結構化的配置檔案,包含專案的詳細資訊、依賴關係、指令碼等。
依賴管理 pip 本身不處理依賴衝突問題,需要開發者手動解決。可以結合 pip-tools 使用,以便更好地管理依賴關係。 poetry 內建依賴解析和鎖定機制,可以自動解決依賴衝突問題。會生成一個 poetry.lock 檔案,確保專案在不同環境下依賴一致。
虛擬環境管理 pip 本身不管理虛擬環境,但通常與 virtualenvvenv 一起使用。開發者需要手動建立和啟用虛擬環境。 poetry 內建虛擬環境管理功能,可以自動建立和管理虛擬環境。使用 poetry 時,虛擬環境的建立和啟用是自動處理的。

2. 使用示例

(1)pip

# 安裝包
pip install requests

# 列出安裝的包
pip freeze > requirements.txt

# 從 requirements.txt 安裝包
pip install -r requirements.txt

(2)poetry

# 建立新專案
poetry new myproject

# 進入專案目錄
cd myproject

# 安裝包
poetry add requests

# 安裝所有依賴
poetry install

# 啟動虛擬環境
poetry shell

3. 建議

示例專案可用 Python 自帶的 pip,簡單易用。大型線上生產專案需要做好依賴管理、依賴衝突解決、虛擬環境管理等工作,以保證專案在多種環境下交付一致且穩定執行,poetry 之類的專案及包管理工具更合適的選擇。

相關文章