- uv đã đơn giản hóa mang tính đột phá việc cài đặt Python và quản lý môi trường ảo, qua đó giải quyết bài toán cấu hình môi trường phức tạp trong hệ sinh thái Python
- Được viết bằng Rust, công cụ này vừa có tốc độ lẫn độ ổn định, đồng thời xử lý cài đặt phiên bản Python, quản lý gói và giải quyết phụ thuộc chỉ với một lệnh
- Tự động nhận diện
pyproject.tomlđể thiết lập môi trường dự án, và vớiuv synccó thể tái tạo môi trường phát triển hoàn toàn giống nhau giữa các thành viên trong nhóm - Thông qua các lệnh như
uv run,uv add,uvx, có thể chạy mà không cần kích hoạt môi trường ảo, thêm gói và chạy một lần - Bằng việc đảm bảo tính nhất quán trong cài đặt và thực thi Python, uv được đánh giá là một bước ngoặt giúp tăng mạnh năng suất của lập trình viên và hiệu quả cộng tác
Tổng quan về uv
- uv là công cụ quản lý Python mã nguồn mở miễn phí do Astral phát triển, với mục tiêu đơn giản hóa quy trình cấu hình môi trường vốn phức tạp
- Astral là đội ngũ đã tạo ra các công cụ phát triển Python như Ruff
- uv hỗ trợ cài đặt phiên bản Python, cài đặt gói, quản lý môi trường ảo, giải quyết phụ thuộc, và nhanh vượt trội so với các công cụ hiện có
- Được phát triển bằng Rust nên hiệu năng rất cao, đồng thời hoạt động trên hầu hết các nền tảng như macOS, Linux, Windows
Cài đặt và cách dùng cơ bản
- Việc cài đặt rất đơn giản, có thể thực hiện bằng một dòng lệnh
curlhoặc PowerShell- Linux/Mac:
curl -LsSf https://astral.sh/uv/install.sh | sh - Windows:
powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"
- Linux/Mac:
- Vì không thay đổi bản cài Python hiện có, nên có thể thử một cách an toàn
Quản lý môi trường dự án
- uv tự động quản lý môi trường ảo cho từng dự án Python và nhận diện tệp
pyproject.tomlđể cấu hình môi trườngpyproject.tomlđịnh nghĩa phiên bản Python, danh sách phụ thuộc, tên và phiên bản dự án- Ví dụ:
[project] name = "my_project" version = "1.0.0" requires-python = ">=3.9,<3.13" dependencies = ["astropy>=5.0.0", "pandas>=1.0.0,<2.0"] - Cách làm này cung cấp định nghĩa môi trường rõ ràng và chuẩn hóa hơn so với pip
Tạo dự án mới
- Có thể dễ dàng tạo dự án mới bằng lệnh
uv init- Tự động tạo các tệp cần thiết như
pyproject.toml,README.md - Hỗ trợ nhiều kiểu khởi tạo khác nhau thông qua các tùy chọn như
--bare,--package - Có thể kiểm tra các tùy chọn chi tiết bằng
uv init --help
- Tự động tạo các tệp cần thiết như
Đồng bộ dự án hiện có
- Nếu dự án có
pyproject.toml, có thể dùng ngay với lệnhuv sync- Tự động cài đặt phiên bản Python
- Tạo môi trường ảo trong thư mục
.venv - Tạo
uv.lockghi lại thông tin phiên bản chính xác của mọi gói
- Dùng lệnh
uv runcó thể chạy script Python mà không cần kích hoạt môi trường- Ví dụ:
uv run myscript.py,uv run jupyter lab
- Ví dụ:
Quản lý phụ thuộc và phiên bản Python
- Có thể tự động thêm và quản lý phụ thuộc bằng lệnh
uv add numpy>=2.0- Không cần chỉnh sửa trực tiếp
pyproject.toml
- Không cần chỉnh sửa trực tiếp
- Với lệnh
uv python pin 3.12.9, có thể ghim một phiên bản Python cụ thể, qua đó đảm bảo khả năng tái lập môi trường
uvx: chạy nhanh cho tác vụ một lần
uvxlà lệnh cho phép chạy công cụ ngay lập tức mà không cần thiết lập môi trường riêng- Ví dụ:
uvx ruff,uvx jupyter lab,uvx --with pandas,pyarrow ipython - Nhờ cơ chế cache nên có thể chạy lại cực nhanh, rất hữu ích cho các công việc thử nghiệm
- Ví dụ:
- Nhờ đó, lập trình viên có thể dễ dàng dựng môi trường chạy tạm thời mà không bị ràng buộc bởi môi trường ảo
Nếu như điều này vẫn chưa đủ thuyết phục bạn: ghi chú cá nhân
- Trong quá trình phát triển The Astrosky Ecosystem, uv đã được áp dụng để thống nhất môi trường Python trên nhiều hệ điều hành
- Giúp mọi lập trình viên và máy chủ sử dụng hoàn toàn cùng một bản cài Python và phiên bản phụ thuộc
- uv cũng quản lý môi trường Python trong GitHub Actions và trên máy chủ production
- Nhờ uv, vấn đề lệch nhau giữa môi trường cài đặt và môi trường kiểm thử biến mất, và việc cộng tác giữa các lập trình viên trở nên đơn giản hơn
Kết luận
- uv giải quyết tận gốc sự phức tạp trong việc cài đặt và quản lý Python, đồng thời giúp các lập trình viên cộng tác ổn định trong cùng một môi trường
- Nhờ tốc độ nhanh và độ ổn định từ nền tảng Rust, uv được xem là “đổi mới lớn nhất đã xảy ra trong hệ sinh thái Python suốt 10 năm qua”
7 bình luận
Tôi đã nghĩ
pdmkhá giống vớiuv, nhưng hình như không có nhiều bàn luận vềpdm.Có vẻ như các bài viết về uv giờ không còn thay đổi nhiều về nội dung nữa.
Maven và Gradle cũng vậy..
Ý kiến trên Hacker News
Trước đây vẫn nghe nói bộ công cụ của Python là đủ dùng, nhưng giờ thấy các lập trình viên Python trải nghiệm hệ sinh thái dựa trên lockfile như npm, cargo hay bundler rồi mới nhận ra ưu điểm của nó thì thật sự rất hả dạ
npm cũng có vấn đề riêng, nhưng cài đặt nhất quán và file khóa phiên bản thực sự là một ý tưởng tuyệt vời
Thật ngạc nhiên khi việc quản lý môi trường lại bất tiện suốt ngần ấy năm
Không rõ vô số nỗ lực thất bại chỉ đơn thuần vì độ khó của quản lý gói hay vì cần vốn VC
pip freeze > requirements.txtvàpip install -r requirements.txttừ lâu rồiNếu không dùng khoảng phiên bản thì requirements.txt về cơ bản cũng đóng vai trò lockfile
Vì vậy tôi thấy làn sóng “lockfile chính thức” dạo này hơi bị thổi phồng
Tôi nghĩ npm cải thiện nhiều là nhờ yarn xuất hiện
Nhanh hơn, hiệu quả hơn và có tính xác định hơn
Xem thêm tại pnpm.io/motivation
Với UV scripts, tôi đã có thể triển khai client/server MCP trong một file duy nhất
Bài liên quan: MCP server in a file
Phần lớn script của tôi đều là một file duy nhất, nên chỉ cần thêm dòng sau ở đầu là mọi thứ đơn giản hơn rất nhiều
#!/usr/bin/env -S uv run --scriptLàm vậy thì script hoạt động như file thực thi độc lập, còn uv sẽ tự động cài các module cần thiết
Vì tác giả script có thể giấu dependency độc hại bên trong
Sẽ tốt hơn nếu có tính năng whitelist
Tuy vậy một số package không phát hiện được ngày phát hành của chúng (ví dụ: yaml)
/usr/bin/env -S, và tên dependency phải là tên gói phân phối dùng trong lệnhuv pip installĐây là tiêu chuẩn PEP 723 và pipx cũng hỗ trợ
Trước khi dùng uv thì tôi không quan tâm đến Rust, nhưng nhờ uv mà tôi bắt đầu chuyển những đoạn mã nhạy cảm về hiệu năng sang Rust
Tôi chỉ mong conda biến mất hẳn. Trên các cụm ML, môi trường conda quá phình to và khả năng tái lập cũng kém
Trước đây tôi đã khá hài lòng với tổ hợp pyenv + venv + pip + pipx, nhưng uv thì
uv run,uv addv.v. thì trải nghiệm dùng tốt hơn hẳnThay vì activate môi trường, chỉ cần thêm
uvtrước lệnh là tiện hơn nhiềuViệc quản lý phiên bản Python cũng dễ hơn, và theo từng project thì có cảm giác batteries-included
Tôi chưa biết về lâu dài độ ổn định sẽ ra sao, nhưng với project mới thì hiện giờ tôi dùng mặc định
Cũng có người không thích việc uv tự động phát hiện môi trường
Tôi không thấy rõ giá trị của quản lý phiên bản Python, nhưng uv giúp tái tạo môi trường nhanh hơn nhiều
uvvào trước lệnh giúp chạy theo kiểu stateless, nên hợp tác làm việc cũng tiệnuvvẫn hữu ích.venvBài blog này gần như trùng khớp hoàn toàn với trải nghiệm của tôi
Ít ma sát hơn và đơn giản hơn
Tôi mong cộng đồng Python chấp nhận uv như công cụ mặc định
Các công cụ viết bằng Rust đã thay đổi hoàn toàn tốc độ phản hồi
Nhưng tôi vẫn tò mò Astral kiếm tiền bằng cách nào. Họ cũng đã nhận đầu tư mà chưa có sản phẩm trả phí
Ví dụ: registry package nội bộ
Phỏng vấn liên quan: phỏng vấn Charlie Marsh
Nếu có 10 triệu lập trình viên Python thì tôi nghĩ uv cũng hoàn toàn có thể kiếm tiền được
Cá nhân tôi thấy type annotation và việc loại bỏ GIL còn quan trọng hơn uv
uv vẫn còn ở giai đoạn đầu nên cũng có những chỗ bất tiện. Xét cho cùng thì nó vẫn chỉ là một package manager nữa mà thôi
resolver mới của pip và việc phân phối wheel tăng lên đã đóng vai trò lớn
Bài liên quan: Wheels are faster for pure Python
Việc nó được viết bằng Rust cũng rất thú vị. Cấu trúc đó hỗ trợ ngôn ngữ khác giống như LLVM
Từ góc nhìn end-user thì uv tốt hơn nhiều, còn nếu maintainer thấy bất tiện thì cứ phản hồi
Nếu có strict mode thì có thể còn giúp cải thiện hiệu năng, nhưng điều đó lại xung đột với triết lý ngôn ngữ
Dù vậy, nếu conda biến mất thì tôi sẵn sàng chuyển sang uv
Tôi không thích uv
uv pip, nên cũng không phải thay thế hoàn toànNhưng đúng là pip và venv cũng hay hỏng và còn khó debug hơn
uv không thay thế ruff
Và cũng không cần phải đụng đến các biến môi trường
uv pipkhông phải là gọi pip mà là cung cấp giao diện tương thíchTrên thực tế uv thay thế pip
Tôi tò mò cụ thể vấn đề tương thích Docker là gì
uv add,uv sync,uv runthì sẽ thuận tay hơn và nhanh hơn nhiềuXem tài liệu chi tiết tại khái niệm dependencies của uv
uv nhanh nên đúng là rất tốt, nhưng cũng khiến tôi tự hỏi liệu sẽ thế nào nếu nó đi theo hướng cải thiện pip.
Tôi đang dùng rất ổn trong ML và Web, nên hy vọng uv sớm trở thành một công nghệ nhàm chán haha
Nhìn repo chỉ có
requirementsmà không cópyproject.tomlthì giờ trông lỗi thời thật haha;