4 điểm bởi GN⁺ 2025-06-24 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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 workspacesuniversal 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ệnh uv lockuv 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ảng cáo

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ệnh uv 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-version theo 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 venv có 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ợ
Quảng cáo

Đó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

 
GN⁺ 2025-06-24
Ý 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

    • Điểm mạnh nhất của uv là hoàn toàn tương thích với workflow dựa trên venv mà tôi vẫn dùng trước đây, chỉ cần chạy uv venv là xong
    • Khi cần giải thích hoặc nhất là hướng dẫn người mới, uv cho cảm giác dễ dùng hơn nhiều, tổ hợp pip + file cấu hình + venv trước đây khá rối vì phải tạo đúng venv rồi cài đặt, lại còn phải nhớ shebang hơi kỳ hoặc kích hoạt venv mỗi lần chạy script/test, thông báo lỗi cũng không phải lúc nào cũng giúp ích trọn vẹn, nên khi dạy người mới tôi luôn thấy bộ công cụ này khá phiền, còn giờ chỉ cần nhớ uv run, uv add, uv sync là đủ nên đồng đội cũng đón nhận nhẹ nhàng hơn hẳn
    • Trường hợp của tôi là đã chuyển từ asdf sang mise, nên cũng tò mò không biết nó so với các công cụ đa dụng như uv thì thế nào
    • Bạn nói cache của pip chiếm nhiều dung lượng và cũng không đổi vị trí cho ra hồn, nên tôi tò mò liệu uv có dùng không gian lưu trữ hiệu quả hơn không, và nếu tốt hơn thì có phải vì cơ chế chia sẻ của nó làm việc tốt hơn không
    • Gần đây tôi có thử làm theo một hướng dẫn ngắn bắt đầu bằng "uv a b c" trong một repo thử nghiệm, nhìn bên trong có vẻ nhiều phần trùng lặp, nhưng khi dùng thực tế trên host GNU-Debian-Ubuntu mặc định thì không gặp vấn đề gì đáng kể và mọi thứ đều chạy trơn tru nên khá hài lòng
  • Lầ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

    • Có lúc cài package chỉ mất khoảng 200ms, nên thứ duy nhất bạn cảm nhận được là một độ trễ rất nhỏ giữa lúc nhấn Enter và lúc prompt hiện lại, trong khi Poetry thì đủ thời gian đi pha một cốc cà phê rồi quay lại, nên chênh lệch tốc độ là quá rõ ràng
    • Tôi cũng có cảm giác y hệt, nó mượt đến mức không giống đang dùng Python
    • Gần đây tôi cũng có trải nghiệm tương tự, và từ đó chuyển hẳn sang uv luôn
    • Tôi cũng từng nghi ngờ như vậy, nhưng sau khi thử rồi thì hài lòng đến mức không thể quay lại như cũ nữa
  • 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ũ

    • Theo tôi thì đa số khi người ta nói câu đó là đang khuyên người mới, tức những ai chưa hiểu rõ hệ thống hiện có, các giới hạn và điểm cần cải thiện mà đã vội lao vào tự làm lại, nên lời khuyên ấy chỉ đúng trong bối cảnh đó, chứ không áp vào chuyên gia thực thụ
    • Họ đâu có phát minh lại bánh xe, mà giống như thay cái bánh xe gỗ cũ bằng vật liệu chắc chắn hơn để nó quay nhanh hơn gấp 10 lần vậy
    • Chỉ nhìn vào lịch sử quản lý package Python thôi cũng thấy ai cũng lao vào với suy nghĩ mình có thể làm tốt hơn cái cũ
    • Thật ra bản thân câu tục ngữ "đừng phát minh lại bánh xe" cũng không hợp lý lắm, vì ngoài đời chúng ta vẫn luôn cải tiến bánh xe, nên trong phần mềm cũng chẳng có lý do gì để không làm ra một bánh xe tốt hơn
    • Hơi lạc đề một chút, nhưng tôi tò mò vì sao người ta thích dùng cách diễn đạt dài như "order of magnitude better" thay vì nói ngắn gọn là "10x"
  • 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

    • Đây hoàn toàn không phải trường hợp kỳ lạ gì, vì rất nhiều người dùng VPS giá rẻ để chạy side project, (tôi cũng thường vậy, dù không dùng AWS), cảm ơn bạn đã chia sẻ và hy vọng tính năng tự phát hiện này sẽ được cải thiện
  • 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ôi

    • Tôi còn dạy cách này cho Claude Project bằng một prompt chuyên biệt, để nó có thể tự động tạo trọn bộ script kèm dependency chỉ với một đầu vào duy nhất, cutoff của Claude 4 là tháng 3 năm 2025, còn trên Claude Sonnet 4 thì tính năng này hoạt động ngay cả khi không có prompt bổ sung, ví dụ chỉ cần nhập URL là nó sẽ tạo ngay code dùng httpx và beautifulsoup để crawl rồi trả về danh sách liên kết dưới dạng CSV tài liệu liên quan kết quả script Claude
    • Tôi dùng mẹo này cùng app-mode của notebook Marimo.io, chỉ cần cài uv là có thể chia sẻ cho người khác những ứng dụng phản hồi được, tái lập được, tạo tại chỗ với mức chuẩn bị tối thiểu, đúng là một tổ hợp tuyệt vời
    • Giờ tôi có thói quen viết và chạy ngay các script nhỏ một cách rất ngẫu hứng, vì không còn phải bận tâm chuyện môi trường hay quản lý dependency nữa nên thoải mái hơn hẳn, bài viết về the little scripter, video YouTube liên quan, GitHub ez-mcp
    • Xin đính chính là tôi đã đọc nhầm ví dụ, và trong ngữ cảnh project thì uv add --script khác với uv 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 --with hay hỗ trợ PEP723, nên rất đáng xem qua hướng dẫn chính thức
    • "mydependencies" cụ thể là gì vậy, có phải ý bạn là file cấu hình không?
  • Tô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

    • pyenv và poetry giờ tôi cũng không còn dùng nữa
  • 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ù vậy, về sau tôi mới thấy hơi tiếc vì ruff chỉ thực hiện một phần các kiểm tra của pylint và còn bỏ sót cả những lỗi quá rõ ràng, (ngay cả code không thể chạy được cũng không bị bắt)
  • 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 -S uv --quiet run --script
    # /// script
    # requires-python = ">=3.13"
    # dependencies = [
    #   "python-dateutil",
    # ]
    # ///
    #
    # [python script that needs dateutil]  
    
    • Dòng shebang này khó nhớ quá nên tôi chỉ mong có một dạng đơn giản hơn như #!/usr/bin/env uvx, vì mỗi lần dùng lại phải đi tìm lại khá phiền
  • Tô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 builduv 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