29 điểm bởi GN⁺ 2025-10-30 | 7 bình luận | Chia sẻ qua WhatsApp
  • 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ới uv sync có 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 curl hoặc PowerShell
  • 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ảng cáo

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ường
    • pyproject.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
Quảng cáo

Đồng bộ dự án hiện có

  • Nếu dự án có pyproject.toml, có thể dùng ngay với lệnh uv 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.lock ghi lại thông tin phiên bản chính xác của mọi gói
  • Dùng lệnh uv run có 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

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
  • 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
Quảng cáo

uvx: chạy nhanh cho tác vụ một lần

  • uvx là 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
  • 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

 
kkksss 2025-11-06

Tôi đã nghĩ pdm khá giống với uv, nhưng hình như không có nhiều bàn luận về pdm.

 
yuntae 2025-10-30

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.

 
pmc7777 2025-10-30

Maven và Gradle cũng vậy..

 
GN⁺ 2025-10-30
Ý 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

    • Không có gì đáng sợ hơn việc phải chạy project Python của người khác
      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
    • Tôi tự hỏi vì sao chuyện này lại mất lâu đến vậy
      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
    • Tôi đã dùng pip freeze > requirements.txtpip install -r requirements.txt từ lâu rồi
      Nế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
    • npm cũng từng không có lockfile trong một thời gian
      Tôi nghĩ npm cải thiện nhiều là nhờ yarn xuất hiện
    • Tôi làm web từ năm 1998, và tôi thấy PNPM tốt hơn npm rất nhiều
      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 --script
    Là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

    • Xét từ góc độ bảo mật thì cách này có chút rủi ro
      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
    • Tính đến thời điểm hiện tại, có thể dùng cờ ngày phát hành tối đa để cố định phiên bản mà không cần lockfile
      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)
    • Để chạy được thì vẫn phải cài uv, nên chưa hẳn là standalone hoàn toàn
    • Cần hỗ trợ /usr/bin/env -S, và tên dependency phải là tên gói phân phối dùng trong lệnh uv pip install
      Đây là tiêu chuẩn PEP 723pipx cũng hỗ trợ
    • Cần có kết nối Internet, và tùy trạng thái của kho lưu trữ mà có thể cài ra phiên bản khác nhau
  • 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

    • Tôi được giới thiệu pixi viết bằng Rust như một lựa chọn thay thế cho conda. Nó tái sử dụng bộ giải PyPI của uv
    • Nếu khóa dependency thì conda vẫn tái lập được, nhưng build chậm
    • Với cụm ML thì tôi nghĩ nên container hóa, như vậy sẽ không cần conda nữa
    • Tôi tò mò uv xử lý quản lý dependency CUDA như thế nào
    • Với cách tiếp cận mã nguồn mở cho quản lý dependency ML quy mô lớn, xem Metaflow docsblog Fast Bakery
  • Trước đây tôi đã khá hài lòng với tổ hợp pyenv + venv + pip + pipx, nhưng uv thì

    • giải quyết dependency cực nhanh
    • với uv run, uv add v.v. thì trải nghiệm dùng tốt hơn hẳn
    • gom nhiều công cụ vào một
    • và việc cài Python cũng đơn giản hơn
  • Thay vì activate môi trường, chỉ cần thêm uv trước lệnh là tiện hơn nhiều
    Việ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

    • Activate môi trường thực ra chỉ là chỉnh PATH và prompt mà thôi
      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
    • Gắn uv và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ện
    • Tôi dùng cùng mise để tự động activate, nhưng tiền tố uv vẫn hữu ích
    • Triết lý của uv là venv là thứ dùng một lần. Nếu có vấn đề thì chỉ cần xóa .venv
    • Thực ra kiểu cấu hình môi trường này vốn là chuyện “chỉ cần hoạt động là được”
  • Bà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í

    • Mô hình doanh thu của Astral là bán phần mềm doanh nghiệp tích hợp với công cụ mã nguồn mở
      Ví dụ: registry package nội bộ
      Phỏng vấn liên quan: phỏng vấn Charlie Marsh
    • Sản phẩm có khả năng phát triển thành dịch vụ trả phí là Pyx
    • Conda cũng đang kiếm tiền chỉ bằng quyền truy cập vào các “gói tăng cường bảo mật”
      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 annotationviệ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

    • Một phần lý do mọi người khen uv thực ra là nhờ pip và venv giờ đã được cải thiện nhờ các PEP tiêu chuẩn hóa
      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
    • Ở cấp độ ngôn ngữ, việc loại bỏ GIL sẽ là thay đổi lớn hơn, nhưng trên thực tế vẫn chưa có nhiều trường hợp hữu ích rõ rệt
    • Type hint vốn đã là tính năng cũ, được đưa vào từ năm 2015
    • uv không chỉ là package manager đơn thuần mà còn có giá trị lớn trong việc đơn giản hóa phân phối
      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
    • Type annotation tốt cho tài liệu hóa nhưng tính thực dụng không cao
      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

    • Nó cố làm quá nhiều thứ: thay pip, pyenv, virtualenv, thậm chí cả ruff cùng lúc
    • Phải dùng uv pip, nên cũng không phải thay thế hoàn toàn
    • Khả năng tương thích với Docker cũng kém
    • Nhiều biến môi trường mới làm tăng độ phức tạp
    • Tôi không thấy lạ khi pyenv, virtualenv, pip tồn tại riêng biệt
      Nhưng đúng là pip và venv cũng hay hỏng và còn khó debug hơn
    • Thực ra pip, pyenv, virtualenv vốn gần như luôn dùng cùng nhau nên một công cụ tích hợp là hợp lý
      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 pip không phải là gọi pip mà là cung cấp giao diện tương thích
      Trên thực tế uv thay thế pip
      Tôi tò mò cụ thể vấn đề tương thích Docker là gì
    • Nếu quản lý bằng uv add, uv sync, uv run thì sẽ thuận tay hơn và nhanh hơn nhiều
      Xem tài liệu chi tiết tại khái niệm dependencies của uv
    • Theo trải nghiệm của tôi, uv làm tốt nhiều vai trò. Tôi muốn biết bạn đã gặp vấn đề cụ thể nào
 
aer0700 2025-11-01

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.

 
ztaka 2025-11-02

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

 
doolayer 2025-10-30

Nhìn repo chỉ có requirements mà không có pyproject.toml thì giờ trông lỗi thời thật haha;