🐍 Python 終於也有了一個上得了檯面的 package manger。
刪除套件時,是真的會找出沒用到的依賴套件並刪除 (確保無 redundancy)
集成非常多 out of the box 的工具 📦
你以為 package manager 安裝套件的耗時,就是讓你去泡咖啡偷懶的時間嗎?
噢不我的朋友🤔,當你拿著你的杯子,準備離開電腦桌的時候,
uv 就已經以趕火車的速度,完成 dependency resolution 並 install 完畢。
想見識這個驚掉下巴的速度,詳見 benchmark。
☢️ WARNING |
---|
此 package manager 仍在開發狀態! 此筆記紀錄的是 version 0.6.10 (2025/03/25) 的功能 |
📘 NOTE |
---|
此 package manager 的 lockfile 為 uv.lock |
PEP 751 (2024/7/26) 終於正式要求了 Python 的標準 lockfile 為 pylock.toml ,這個小傢伙應該還需要一點時間,來發展成廣泛使用的 lockfile。 |
📘 NOTE |
---|
uv 預設使用 hardlink 安裝 (連結到 local cache) |
🚨 CAUTION |
---|
uv 目前還沒有自己的 build backend (他們是用現有的第三方庫 hatchling ) |
🚨 CAUTION |
---|
uv 目前還不支援 scripts (噢不!我愛 npm scripts ) |
請參考 UV CLI。
init
:創建專案--python
指定 Python 版本
--app
app
通常是一些應用程式,比如 web app 或 api endpoints 等等--lib
lib
類型通常是一些函式庫uv sync
才會本地 venv 安裝uv sync
時,會順便在 developer 本地 venv 安裝一次,可一邊開發一邊測試功能
pip install -e .
一模一樣,只不過 uv 更強大,編輯後不用再重安裝,就可以直接測試src/
目錄加入 sys.path
辦到的吧src/project_lib/
目錄與其內容,會被放入 user 的 .venv/Lib/site-packages/
--package
package
類型通常是一些 CLI 工具uv sync
才會本地 venv 安裝uv sync
時,會順便在 developer 本地 venv 安裝一次,可一邊開發一邊測試功能
pip install -e .
一模一樣,只不過 uv 更強大,編輯後不用再重安裝,就可以直接測試src/
目錄加入 sys.path
辦到的吧src/project_package/
目錄與其內容,會被放入 user 的 .venv/Lib/site-packages/
.venv/Scripts/
生成執行檔,供 user 調用 (記得他得先進入 venv 才能用)--no-workspace
--build-backend
指定打包用 backend
若專案是可發布套件才會用到的選項。
你可以自己指定第三方 build backend,比如:hatch
(hatchling)、setuptools
(setuptools)。
預設是hatch
(hatchling)。
run
:執行腳本--with
暫時將某版本的套件加入環境並執行
套件會被下載到全域 cache,若很久沒清會很胖,要定期 prune 一下。
venv
:虛擬環境創建虛擬環境 (預設目錄名 .venv
)
--python
指定虛擬環境 Python 版本
🚨 CAUTION |
---|
由於 uv sync 根據 .python-version 和 pyproject.toml 內的 requires-python 決定 Python 版本,若使用 uv venv 切換虛擬環境的 Python 版本,記得要先手動更改這兩塊地方。 |
可靈活切換虛擬環境 Python 版本,但要重新下載相依套件。
add
/ remove
:安裝 / 移除套件uv 如 poetry 或 pnpm 一樣,會自動解析並順便移除沒用到的相依套件。並且有 lockfile 嚴格管理套件版本。
--no-sync
不自動同步
只解析依賴,然後更新
pyproject.toml
和uv.lock
,不會自動使用uv sync
安裝或移除套件。
sync
:同步套件安裝全部套件的加強版。
假如發生一些意外,導致你的 venv 缺了某些套件,或者 lockfile 不小心掉入垃圾桶,都可以用這個同步重新長回來。
tool
:工具工具是一種提供 CLI 的執行檔或 Python 套件。
工具會被獨立安裝在特別的環境 (非專案內的 venv),以避免受相依套件影響。
run
類似 npx
(可簡寫 uvx
)
install
/ uninstall
安裝 / 移除
dir
工具被安裝在哪個目錄
python
:多版本list
列出
install
/ uninstall
安裝 / 移除
pin
切換 Python 版本 (更改 .python-version
)
--global
全域切換
export
:輸出 lockfilerequirements.txt
build
/ publish
:構建 / 發布套件uv build
+ uv publish
,就這麼簡單。唯 publish 時須注意兩點:
下指令時要指定套件源
--index testpypi
(要先在pyproject.toml
設定)。
因此 username 你要輸入
__token__
,password 再輸入 API token 即可。
cache
:快取uv 為避免重複的下載,採取激進的快取策略,這導致快取容易變胖,要定期 prune。
clean
/ prune
清除 / 修剪
這兩兄弟用法也是和 pnpm 很像,前者是完全清除所有快取,後者僅移除沒用到的快取。
self
:針對 uv 自身的功能update
自行更新
只能用在 standalone 安裝版 (比如 Linux 的
curl
或wget
、Windows 的irm
),
若使用 Linux 的apt-get
、Mac 的brew
、Windows 的scoop
等 package manager 安裝uv
,
需要使用 package manager 它們自己的 upgrade 方式。
lock
:手動生成 lockfile…
tree
:依賴樹…
pip
:相容 pip 介面…
generate-shell-completion
指令自動補全$PROFILE
(腳本)~/.bashrc
(腳本)註:開啟 shell 時,會先執行一遍這個初始化腳本,註冊設定。
--index
:指定套件源可在 pyproject.toml
定義不同套件源,下指令時就可以加上 --index
name 選擇。
指定某個套件一定要從這個套件源下載
--group
/ --no-group
:指定相依套件組將 ruff 安裝到 dev groups