Python 套件管理器 uv 介紹——與 Poetry 比較
from Pixabay
3 年前,我寫了這篇〈Python 套件管理器——Poetry 完全入門指南〉,它成為了本站最受歡迎的文章之一。
隨著 Python 開發生態的發展,新的工具不斷湧現,你可能已經聽過,我們今天要介紹的主角——Astral 的 uv。
之前有讀者希望我介紹 uv,但因為沒有急迫需求,所以一直拖到最近才開始嘗試。
這幾天,我終於在 side project 中開始使用它,因此有了初步的心得。
這篇文章將先介紹 uv 的背景、特點,以及和 Poetry 的比較(這是我最在乎的,也是所有習慣 Poetry 的讀者可能感興趣的),幫助你評估是否要轉向這個新工具。
至於教學,我會在下一篇文章中分享 uv 的實際使用方式,包括安裝、專案初始化、依賴管理等操作,協助你快速上手。
Python 套件管理的現況與挑戰
在 Python 開發生態中,pip
和virtualenv
在過去很長一段時間裡,都是套件安裝與虛擬環境管理的主流工具。
然而,隨著專案規模的擴大與需求的多樣化,這些工具逐漸暴露出一些限制,例如安裝速度慢、依賴衝突難以解決,以及缺乏統一的專案管理流程。
為了解決這些問題,社群中出現了如 pip-tools
、pipenv
和 poetry
等工具,試圖提供更完善的解決方案。
這些工具在一定程度上改善了套件管理的體驗,但也引入了新的學習曲線和複雜度。
讓人不禁羨慕起 Rust 的 Cargo 套件管理器——唯一的選擇,而且體驗絕佳。
該如何選擇?
總之,我們不得不選擇,而且沒有一個完全壓倒性的方案——這是 Python 生態的一大特色XD
過去我選擇了 Poetry,現在則開始嘗試 uv。
本文記錄我的思路與心得,讓你可以根據自己的需求做出判斷。
uv 是什麼?
uv 是由 Astral 團隊開發的一款現代化的 Python 套件管理暨打包(packing)工具。
乍聽之下,它做的事和 Poetry 大小同異——確實如此,只是更加包山包海,並且是用 Rust 寫的。
就像同為 Astral 出品的 Ruff,它們的共同目標都是成為該領域的「唯一選擇」XD
而且從目前的趨勢看起來,似乎很有機會!
uv 的核心特點
uv 作為一個現代化的 Python 套件管理工具,具有以下幾個核心特點:
- 高效能:uv 在套件安裝與依賴解析方面比傳統工具快上 10 到 100 倍。
- 整合式工具:結合了打包、套件管理、虛擬環境管理、Python 版本管理等功能。其中 Python 版本管理是 uv 的一大特色,意味著你不必再搭配
pyenv
等工具。 - 跨平台支援:支援 macOS、Linux 和 Windows,適用於多種開發環境。雖然是 Rust 寫的,但你無須擔心環境設定與安裝問題。
uv 的特點很多,作為使用者,我必須要找到一些具體切入點,來作為是否使用的判斷依據。
因此,身為一個 Poetry 長期使用者,我自然會更關心它相對於 Poetry 有哪些優勢、是否值得我學習並轉向這個新工具。
經過幾天的嘗試,我認為 uv 相較於 Poetry 具備三個主要優勢。
優勢一:後發優勢與透明度
uv 比較晚出現,所以它的「歷史包袱」遠比 Poetry 要少得多。
Poetry 在 2018 年開始發展,這意味著它需要考慮到許多舊版的相容問題。而且很多時候,Poetry 團隊直接選擇不相容——而且也沒有充分說明,然後被社群罵爆。
例如,某個 minor/patch release 引入了不向後相容的變更,導致 CI/CD 流程或 Docker 容器重建失敗。
這類事件讓部分使用者對 Poetry 的版本管理失去信心。
我從 1.1.x 開始使用,幾乎每個大版本都會有一些惱人 breaking change🤬
uv 不止比較新,而且在 breaking change 的透明度和文件化方面,看起來比 Poetry 更謹慎。
優勢二:更快、更簡單
uv 用 Rust 寫的,這意味著它在性能上有著天然的優勢。
本來我是覺得這不算很重要的事情,畢竟套件的安裝、依賴解析等操作,通常不會頻繁發生。
但實際上,這些操作的速度如果不夠快,還是會影響開發者體驗——尤其在套件愈裝愈多的情況下。
如果考慮到 CI/CD 流程,差異就更明顯了。
更簡單的指令設計
我一直覺得,Poetry 的指令設計有些複雜,而且太多了!
uv 則相對好一些(雖然還是不少),子命令的設計也更為直觀,例如 uv python
、uv pip
等。
這裡我覺得「更簡單」的主要意思是:uv 在日常操作下的常用指令更少、更精簡。
優勢三:包含了 Python 版本管理
事實上,不止 Python 的套件管理生態是一鍋大雜燴,Python 的版本管理生態也是。
什麼 Anaconda、pyenv,甚至是 Docker,都可以用來管理 Python 環境。
太煩了!
尤其在使用 Poetry 建立虛擬環境時,你很可能會遇到無法精確控制它用哪個 Python 版本的情況。
為此我又寫了這篇〈Poetry + pyenv 教學:常用指令與注意事項〉——這實在是無奈之舉。
uv 的一大特色是內建了 Python 版本管理功能,你可以直接透過它下載與管理不同的 Python 版本,無需額外安裝pyenv
或其他工具。
省去這個 Python 版本指定的麻煩,讓我在使用 uv 時感覺輕鬆許多。
我要學 uv 嗎?三種讀者情境分析
在了解了 uv 的三個主要優勢後,接下來我們可以根據不同的使用情境,來探討它是否適合你的需求。
以下是我給下列三種讀者的建議。
1. 只用過pip
不用說,這個年代只有pip
肯定是不夠的,而此時此刻要學一個能夠長久使用的套件管理工具,我應該還是會推薦 uv。(而不是 Poetry)
2. 正在使用 Poetry,覺得還行
學習新的 Python 套件管理工具的「認知成本」並不低,如果沒有實際需求,維持現狀也不失為一個好選擇。
3. 已經使用 Poetry,但有很多不滿
如果上述 uv 相對 Poetry 的優勢,正好是你不滿的地方,則可以認真考慮轉向 uv。
我的選擇
我目前在工作上還是使用 Poetry,所以沒辦法直接捨棄它。
不過,預計未來個人專案應該都會轉向 uv。
要說理由,對我來說核心理由只有一個,就是它包含了 Python 版本的管理。
結語
綜上所述,uv 相較於 Poetry,確實有它令人心動的地方。
無論你是剛接觸 Python 套件管理的新手,還是對現有工具感到不滿的進階使用者,uv 都是一個值得嘗試的選擇。
在下一篇文章中,我將進一步介紹 uv 的實際使用方式,包含安裝、專案初始化、依賴管理等操作,幫助你快速上手這個新工具。