uv, trình quản lý gói và dự án Python cực nhanh được viết bằng Rust
(github.com/astral-sh)- uv là công cụ quản lý gói và dự án Python cực nhanh dựa trên Rust
- Có thể thay thế pip, pip-tools, pipx, poetry, pyenv, virtualenv, v.v. trong một công cụ duy nhất
- Cung cấp hiệu năng nhanh hơn tối đa 10~100 lần, tiết kiệm dung lượng đĩa, bộ nhớ đệm mạnh mẽ và hỗ trợ cross-platform
- Bao gồm các tính năng hỗ trợ môi trường phát triển tích hợp như quản lý script, project, tool và nhiều phiên bản Python khác nhau
- Có thể hiện thực hóa quy trình phát triển Python hiện đại được tối ưu cho năng suất lập trình, dự án quy mô lớn và tốc độ làm việc cao
Giới thiệu mã nguồn mở và các điểm khác biệt
- uv tích hợp vào một công cụ duy nhất các chức năng của nhiều công cụ quản lý Python hiện có như pip, pip-tools, pipx, poetry, pyenv, virtualenv, twine
- Được phát triển bằng Rust nên có hiệu năng rất cao, với tốc độ cài đặt và đồng bộ nhanh hơn 10~100 lần so với pip truyền thống
- Cung cấp khả năng tối ưu sử dụng dung lượng đĩa nhờ global cache và loại bỏ trùng lặp phụ thuộc, đồng thời hỗ trợ CLI trực quan và khả năng tương thích pip quen thuộc
- Có thể cài đặt dưới dạng tệp thực thi độc lập trên nhiều nền tảng như macOS, Linux, Windows
- Nổi bật với tính tiện dụng cao như cài đặt độc lập, tích hợp với pip và pipx, cùng hỗ trợ tự động cập nhật riêng
Tính năng chính (Highlights)
- Một công cụ uv có thể thay thế nhiều chức năng của pip, pip-tools, pipx, poetry, pyenv, twine, virtualenv, v.v.
- Cung cấp hiệu năng cài đặt/cập nhật/đồng bộ nhanh hơn 10~100 lần so với pip hiện tại
- Hỗ trợ quản lý phụ thuộc dự án dựa trên lockfile, cùng workspaces và universal lockfile
- Hỗ trợ khai báo phụ thuộc inline cho script và tự động chạy trong môi trường cách ly
- Hỗ trợ quản lý/cài đặt/chuyển đổi nhiều phiên bản Python
- Hỗ trợ chạy và cài đặt các công cụ được phân phối dưới dạng gói Python (thay thế pipx)
- Tương thích giao diện pip và cung cấp thêm tính năng mở rộng (ghi đè phiên bản, giải quyết độc lập nền tảng, v.v.)
- Workspace kiểu Cargo tối ưu cho các dự án quy mô lớn
- Global cache giúp giảm trùng lặp phụ thuộc và tối ưu dung lượng đĩa
- Có thể cài đặt và sử dụng bằng curl hoặc pip, pipx ngay cả khi không có sẵn môi trường Rust/Python
- Hỗ trợ đa nền tảng gồm macOS, Linux, Windows
- Được phát triển bởi đội ngũ đã tạo ra Astral và Ruff
Quản lý dự án (Project Management)
- Hỗ trợ đầy đủ phụ thuộc, môi trường, tệp khóa (lock), workspace ở cấp độ dự án
- Tự động khởi tạo dự án và tạo virtualenv bằng lệnh
uv init - Thêm phụ thuộc bằng
uv add, và tự động đồng bộ gói cũng như kiểm tra bảo mật bằng các lệnhuv lockvàuv sync - Thay thế các tính năng của những công cụ quản lý dự án Python hiện đại như Poetry, Rye, đồng thời đảm bảo tốc độ xử lý nhanh hơn
- Cũng hỗ trợ build và publish các dự án không do uv quản lý
Quản lý script (Scripts)
- Có thể khai báo metadata phụ thuộc inline trong script một tệp duy nhất
- Khi chạy script, hỗ trợ tự động tách virtualenv và cài đặt phụ thuộc
- Quản lý phụ thuộc theo từng script bằng
uv add --script, và chạy cách ly môi trường bằng lệnhuv run - Tối ưu cho các script dùng một lần như khoa học dữ liệu/tự động hóa
Quản lý công cụ (Tools)
- Có thể cài đặt và chạy các công cụ CLI ở dạng gói Python giống như pipx
- Sử dụng môi trường tạm thời hoặc chạy toàn cục bằng các lệnh
uv tool install,uvx - Hỗ trợ kiểm tra công cụ đã cài, quản lý phiên bản và cập nhật
Quản lý phiên bản Python
- Có thể dễ dàng cài đặt và chuyển đổi ngay lập tức giữa nhiều phiên bản Python
- Quản lý song song nhiều phiên bản và có thể ghim
.python-versiontheo từng dự án - Cũng hỗ trợ cùng một giao diện cho các implementation thay thế như pypy
- Dùng các lệnh như
uv python install/pinđể cài đặt, chỉ định và kích hoạt phiên bản
Giao diện pip (Pip Interface)
uv pip,uv venvcó thể thay thế hoàn toàn pip, pip-tools, virtualenv hiện có- Bao gồm các tính năng nâng cao như ghi đè phiên bản phụ thuộc, giải quyết độc lập nền tảng, build có thể tái lập
- Có thể thay thế pip drop-in mà không cần thay đổi workflow hiện tại, đồng thời mang lại cải thiện hiệu năng 10~100 lần
- Hỗ trợ chuyển đổi requirements.in → requirements.txt, tạo virtualenv và đồng bộ requirements
Chính sách nền tảng và phiên bản
- Hỗ trợ nhiều hệ điều hành khác nhau (Windows, macOS, Linux)
- Có thể tham khảo tài liệu chính thức để biết thông tin về chính sách và các nền tảng được hỗ trợ
Đóng góp (Contributing)
- Hướng tới hỗ trợ nhiều đối tượng đóng góp từ người mới bắt đầu đến chuyên gia, và cung cấp hướng dẫn liên quan
FAQ
- uv được phát âm là “yu-vi”
- Kiểu chữ được cố định là chữ thường “uv”
Nền tảng kỹ thuật và lời cảm ơn (Acknowledgements)
- Thuật toán giải quyết phụ thuộc sử dụng PubGrub
- Triển khai Git dựa trên Cargo
- Chiến lược tối ưu hóa nhận nhiều cảm hứng từ các công cụ đóng gói hiện đại như pnpm, Orogene, Bun, Posy
Giấy phép
- Có thể lựa chọn sử dụng theo MIT hoặc Apache-2.0
- Mã được đóng góp cũng được cấp phép kép theo cùng điều kiện
1 bình luận
Ý kiến trên Hacker News
Cho đến vài tháng trước tôi còn nghĩ mình sẽ không bao giờ dùng uv, vì đã quen với venv và pip nên không thấy cần thêm công cụ nào khác, nhưng gần đây tôi gặp tình huống trên một máy chủ dùng chung không có quyền root, đủ loại package và driver đều hỏng cả, lại cần dùng pytorch, và nhờ trải nghiệm đó mà giờ đã chuyển hẳn sang uv, pip thì mất rất nhiều thời gian, cache lại chiếm cực nhiều dung lượng và cũng không dễ đổi vị trí, còn từ khi chuyển sang uv thì mọi thứ chạy quá ổn nên rất hài lòng, nếu vẫn còn lưỡng lự thì tôi thật sự khuyên hãy thử ít nhất 5 phút
uv venvlà xonguv run,uv add,uv synclà đủ nên đồng đội cũng đón nhận nhẹ nhàng hơn hẳnLần đầu dùng uv, tôi còn tưởng nó làm sai gì đó hoặc chưa chạy đúng, vì so với pip thì mọi thứ xong nhanh đến mức khó tin
Tôi nghĩ uv và ruff là những phản ví dụ rất hay cho câu "đừng bao giờ phát minh lại bánh xe", nếu mục tiêu đủ rõ ràng thì vẫn có thể tạo ra thứ vượt trội hơn hẳn cái cũ
Trên các hệ thống nhỏ/cấu hình thấp (ví dụ AWS T2.micro chạy Windows), uv cố tải xuống đồng thời quá nhiều nên bị timeout, nhưng chỉ cần giới hạn số lượt tải đồng thời xuống khoảng 1~2 bằng biến môi trường UV_CONCURRENT_DOWNLOADS là giải quyết được, tôi thấy thiết lập mặc định của uv hơi quá tay và sẽ tốt hơn nếu nó tự điều chỉnh theo từng máy chủ, chẳng hạn dựa trên tốc độ tải xuống
Gần đây tôi dùng thử uv cho mục đích cá nhân trên laptop, và với người đã quen pip như tôi thì tốc độ nhanh đến mức thực sự khó tin, đến nỗi vài lần còn bối rối không biết nó đã chạy xong đúng cách chưa
Tôi rất thích lệnh
uv add <mydependencies> --script mycoolscript.py, rồi chỉ cần thêm#!/usr/bin/env -S uv runở đầu file là có thể chạy script Python ngay lập tức, nên nó đang là một công cụ cực kỳ hữu ích với tôiuv add --scriptkhác vớiuv addđơn thuần, ngoài ra tài liệu chính thức còn có nhiều tính năng hữu ích hơn nhưrun --withhay hỗ trợ PEP723, nên rất đáng xem qua hướng dẫn chính thứcTôi từng thử uv từ trước, và đã ngạc nhiên vì nó vừa nhanh áp đảo vừa dễ dùng, giờ gần như không còn lý do gì để dùng pip nữa, và nếu chỉ làm việc với Python thì thậm chí cũng không cần conda
Tôi thật sự rất thích UV, và cũng thích Ruff của đội Astral nên đã chuyển toàn bộ linting/formatting từ pylint + Black sang Ruff, thời gian lint giảm từ 90 giây xuống còn dưới 1,5 giây, thật sự rất sốc
Dạo gần đây tôi rất thích và hay dùng mẫu dưới đây để chạy các script thực thi nhỏ
#!/usr/bin/env uvx, vì mỗi lần dùng lại phải đi tìm lại khá phiềnTôi hài lòng hoàn toàn và không muốn quay lại pip/twine/requirements.txt nữa, trước đây nhiều project của chúng tôi đặt wheel dùng chung trong GitLab nội bộ, và 10 dòng YAML cũ giờ có thể thay bằng chỉ hai dòng
uv buildvàuv publish, việc lấy dependency tiện hơn nhiều và cũng có thể xem các dependency chính trong một chỗ, không còn cảnh trộn tất cả mọi thứ vào một file requirements.txt nữa