Rye: trải nghiệm Python không phiền toái
(rye.astral.sh)- Rye là một công cụ quản lý dự án và gói từng nhằm xử lý việc cài đặt Python, dự án
pyproject.toml, dependency, virtualenv và cài đặt công cụ toàn cục ở một nơi - Hiện tại việc phát triển đã dừng, và người dùng được khuyến nghị sử dụng dự án kế nhiệm uv do cùng các maintainer tạo ra
- Người dùng hiện tại có thể tham khảo uv migration guide để chuyển đổi; Rye vẫn có thể tải về, nhưng không có kế hoạch cập nhật thêm
- Việc dừng cập nhật cũng bao gồm cập nhật bảo mật, nên với dự án mới hoặc môi trường bảo trì dài hạn, nên cân nhắc chuyển sang uv
- Trải nghiệm Python tích hợp mà Rye hướng tới bao trùm cả các dự án phức tạp và monorepo, nhưng trọng tâm bảo trì đã chuyển sang uv
Tình trạng hiện tại của Rye
-
Dừng phát triển và khuyến nghị dùng uv
- Tất cả người dùng được khuyến nghị sử dụng uv
- uv là dự án kế nhiệm do cùng các maintainer tạo ra
- uv đang được bảo trì tích cực và được sử dụng rộng rãi hơn Rye rất nhiều
- Người dùng Rye hiện tại có thể tham khảo uv migration guide
- Rye vẫn có thể tiếp tục sử dụng, nhưng không có kế hoạch cập nhật thêm
- Cũng không có kế hoạch cập nhật bảo mật
Các tính năng Rye từng cung cấp
- Rye là giải pháp quản lý dự án và gói cho Python
- Được tạo ra với mục tiêu trở thành công cụ tất cả-trong-một cho người dùng Python
- Xử lý các công việc sau trong một trải nghiệm tích hợp duy nhất
- Quản lý cài đặt Python
- Quản lý dự án dựa trên
pyproject.toml - Quản lý dependency
- Quản lý virtualenv
- Cài đặt công cụ toàn cục
- Được thiết kế để xử lý các dự án phức tạp và monorepo
- Có thể xem video giới thiệu tại Watch an introduction
2 bình luận
Tôi thì cũng đã một thời gian, sau khi dùng thử cái này cái kia
Introduction - PDM
đang được tôi sử dụng.
Có lẽ tôi cũng nên thử dùng Rye.
Ý kiến trên Hacker News
Phần lớn công việc phát triển packaging cốt lõi hiện đang diễn ra trong uv, và Rye dùng uv ở bên trong, nên khi uv tốt hơn thì Rye cũng tốt hơn theo
Ví dụ, gần đây uv đã thêm phân giải phụ thuộc phổ quát, nhờ đó có thể tạo
requirements.txtđược khóa bằng một kết quả phân giải duy nhất hoạt động trên mọi nền tảng và hệ điều hành, chứ không chỉ hệ thống đang chạy hiện tại; Rye phiên bản mới nhất cũng hỗ trợ tính năng nàyhttps://github.com/astral-sh/uv
Tôi đang phát triển Rye và uv, nên nếu có câu hỏi thì tôi có thể trả lời
https://github.com/python-poetry/poetry/issues/6409
https://news.ycombinator.com/item?id=39257501
Đây là một trong những lý do khiến nhóm của tôi còn do dự khi chuyển sang. Vì chúng tôi làm ML, lấy một dự án dựa trên PyTorch làm ví dụ: trạng thái mong muốn là đặt toàn bộ dependency trong
pyproject.toml, rồi từ máy Mac AArch64 hoặc workstation Windows AMD64 có thể tạo các file khóa cho các cấu hình nền tảng sau: Mac dùng MPS PyTorch mặc định, Windows dùng CUDA PyTorch, AArch64 Linux dùng CPU PyTorch, AMD64 Linux dùng CPU PyTorch, AMD64 Linux dùng CUDA PyTorchCảm ơn vì đã tạo Ruff; chúng tôi rất hài lòng với cả linting lẫn formatting
pyenv+venv+piplúc nào cũng khổ sở; giờ tôi đã chuyển sang RyeBây giờ chỉ cần cài Rye, kéo từ GitHub về, gõ
rye synclà xonghttps://guac.sh/
https://pypi.org/project/sbom4python/ https://github.com/CycloneDX/cyclonedx-python
Nhờ tính năng mới thêm gần đây cho phép bỏ ghim dependency, trong quá trình phát triển có thể khuyến khích duy trì tính tương thích, đồng thời tạo được
requirements.txtchính xác và tường minh để tái lập; nhờ vậy các bước quản lý lỗ hổng và SBOM dễ hơn nhiều so với các công cụ như PoetryVì lý do tương tự, chúng tôi đang dùng https://hatch.pypa.io/latest/why/, và tôi cũng thích việc nó phối hợp tốt với
uvĐiều khiến tôi ngần ngại với Rye là nó khuyến nghị khá mạnh việc dùng bản build Python không chuẩn
Trang triết lý (https://rye.astral.sh/philosophy/) giải thích rằng các bản build CPython từ python.org hoàn toàn không phù hợp; tùy nền tảng mà chỉ có file cài đặt
.msihoặc chỉ có tarball; và nhiều bản phân phối Python phân kỳ mạnh, tạo đủ loại vấn đề cho các hệ sinh thái con. Vì vậy dự án này dùng các bản build độc lập của indygreg, và nói rằng họ hy vọng một ngày nào đó sẽ có các bản build Python được quản lý tốt, đáng tin cậy để thay thế tình trạng hỗn loạn hiện nayThông tin về các bản build indygreg đó nằm ở https://gregoryszorc.com/docs/python-build-standalone/main/, và cũng có thể chọn Python khác: https://rye.astral.sh/guide/toolchains/
Tuy nhiên, tôi hầu như chưa từng gặp những vấn đề mà họ nói đến. Bản build Python chính thức tải từ python.org vẫn chạy được, Python bình thường cài bằng trình quản lý gói của distro cũng chạy được, và Python đi kèm trong image container Docker chính thức cũng chạy được
Các bản build đặc biệt đó chắc cũng chạy tốt, nhưng tính không chuẩn khiến tôi do dự. Thậm chí còn có cả danh sách những điểm đặc thù trong hành vi; tôi không hiểu vì sao lại thêm đặc thù vào một thứ vốn không có vấn đề. Việc triết lý của Rye quá tích cực thúc đẩy dùng các bản build đó cũng làm nó kém hấp dẫn hơn so với các lựa chọn mặc định dùng Python đã có sẵn trong hệ điều hành
Muốn build Python từ source thì cần các dependency hệ thống mới và mất nhiều thời gian, rồi cuối cùng lại gặp lỗi còn khó hiểu hơn về header file bị thiếu. Tìm lỗi đó thì ra một cờ
./configuređể né vấn đề mà GCC upstream đã sửa từ năm 2017, và dù sao thì cuối cùng cũng thành côngNếu bạn chưa từng gặp 3 lỗi như vậy hay môi trường build manylinux, nghĩa là bạn đã tránh được nguyên một thế giới đau khổ. Việc script hóa cài đặt trên Windows hay phần “giới hạn các lệnh CPU khả dụng” trên trang đó cũng tương tự
Thường xuyên tải mã nguồn Python về, biên dịch với các tối ưu hóa production tiêu chuẩn rồi cài vào
/use/local/python${version}; kể từ khi Python 3.7 ra mắt năm 2018, quy trình này hoạt động rất nhất quánTheo kinh nghiệm của tôi, các lệnh này ổn định và nhất quán đến mức có thể tự động hóa. Tôi tò mò điểm mà tác giả cho là vấn đề, hay lời phản đối căn bản là gì
Ví dụ, không thể tải file cài đặt Python 3.10.14; file cài đặt Windows cuối cùng là Python 3.10.11, bản ngày 5 tháng 4 năm 2023
Tôi thích Rye. Nó làm đúng những gì đã tuyên bố, thực sự khiến toàn bộ quy trình
venv/phiên bản Python/đóng gói trở nên dễ chịu, và với những ai đã quen với cách dùng Python chính thức nhưpyproject.tomlthì gần như cảm thấy trong suốtHơn nữa, nó khiến Python có cảm giác giống Cargo, mà Cargo cũng là một công cụ dễ dùng
Cá nhân tôi cho rằng pip-tools có thiết kế tốt hơn Poetry hay Pipenv rất nhiều. Nó trực giao với cả pip lẫn
virtualenv, và cả hai đều là những luồng đã tồn tại lâu trong Python. Rye có thể được xem là một ví dụ cho thấy cách tiếp cận tuân thủ tiêu chuẩn, được cải tiến lặp lại, đã chiến thắngNgoài cải thiện tốc độ nhờ Rust, tôi thích việc nó đưa ra các mặc định hợp lý về nơi đặt môi trường ảo (
.venv) và cách cài nhiều phiên bản Python. Nghe có vẻ nhỏ, nhưng sau khi wheel giải quyết vấn đề cài numpy, những mặc định hợp lý như vậy cùng pip-tools tích hợp sẵn về cơ bản là tất cả những gì còn thiếu. Theo nghĩa đó, tôi cũng tự hỏi sau khi có binary wheel thì lý do tồn tại của Anaconda là gìRất vui khi thấy giờ đây nó cuối cùng cũng đang khá hơn
Có vẻ trình quản lý gói Python còn nhiều hơn cả ứng dụng chat của Google
Và về mặt tuyển chọn/kiểm soát, đề xuất rằng nên tin một tổ chức nhỏ hơn thay vì một tổ chức lớn và lâu đời hơn có vẻ khó thuyết phục. Nói cách khác, tôi tò mò chính xác thứ nó tuyên bố làm là gì. Những gì tôi đọc được chỉ khoảng “trình quản lý gói tốt thì tốt, nhanh và tốt”, nên nếu có trang so sánh hoặc triết lý thì sẽ hay hơn
Sự hoài nghi trên HN đôi khi khiến tôi ngạc nhiên
Tôi thích Rye. Sau khi dùng các trình quản lý gói của ngôn ngữ khác như Cargo hay Hex, tôi luôn tiếc là Python không có hệ thống tương tự, và Rye đã hoàn toàn giải tỏa cơn khát đó. Với tư cách người không muốn cài nhiều công cụ chỉ để quản lý
venv, phiên bản Python và phụ thuộc dự án, việc một mình Rye xử lý tất cả thật sự rất tuyệtTôi vẫn chưa có cảm nhận về Rye, nhưng conda cũng có thể quản lý tốt
venv, phiên bản Python và phụ thuộc dự ánGặp một trình quản lý phụ thuộc Python mới giống như tình cờ phát hiện một framework JavaScript mới
venvlà đượcNếu phải xử lý port, phải phân phối chương trình, hoặc thư viện phụ thuộc vào C hay thành phần hệ điều hành, thì tốt hơn là nhận việc tư vấn mà sau khi được trả tiền không cần quản lý codebase hay chịu trách nhiệm nữa
Ngày nay còn có thể chạy CUDA và PyTorch trong Docker. Trong các thread kiểu này, khi ai đó nói “cứ dùng Docker là được”, câu trả lời thường thấy là “tôi không muốn học Docker”, nhưng ngay cả khi chưa có chút kinh nghiệm Docker nào, dựng một container Python cũng chỉ mất 10 phút
pixi(https://pixi.sh/latest/) khá tốt. Nó có thể cố định phiên bản Python, cài gói từ conda và PyPI, và được viết bằng Rust
curlrồi pipe sang bash, sau đóevalđầu ra của lệnh tùy ý khiến tôi thấy ngạiBối cảnh hơi phức tạp. Công ty Anaconda có conda được viết bằng Python, còn hệ sinh thái mã nguồn mở conda-forge là một kênh conda có bot build CI. Sau đó, cũng dưới mái nhà conda-forge, mamba viết bằng C++ xuất hiện như một lựa chọn thay thế conda, và nó là một thay thế drop-in thực sự ở mức
alias conda=mambaphải hoạt động. Hiện nay conda cũng dùng libmamba làm bộ phân giải để tăng tốcSau đó tác giả mamba tách nó thành pixi, viết lại bằng Rust và thay đổi triết lý về vị trí môi trường cũng như cách kích hoạt, nhưng vẫn hoàn toàn tương thích với môi trường conda
conda luôn hỗ trợ cài đặt các gói PyPI thông qua
piptrong những trường hợp như khi chúng không có trên kênh conda, còn pixi hỗ trợ các gói PyPI thông qua uv. Vì vậy pixi nhanh. Theo bài blog, còn có các tối ưu hóa khác khiến nó nhanh hơn mamba rất nhiềuNếu dùng các gói không phải Python thuần túy thì hệ conda là phù hợp. Việc chọn trình quản lý gói (conda/mamba/pixi) chỉ là thứ yếu
Vấn đề của PyPI là thiếu vai trò gác cổng. Cộng thêm việc thiếu một cách chuẩn để đóng gói các gói không phải Python thuần túy, môi trường có thể bị rò rỉ; đặc biệt nếu chỉ phân phối mã nguồn rồi làm những việc kỳ lạ như bootstrap môi trường trong
setup.py, thậm chí bao gồm cả compiler, thì sẽ trở nên không thể tái lậpỞ phía conda, kênh conda-forge thực hiện kiểm soát chất lượng khá tốt. Họ kiểm tra các ràng buộc, giấy phép, vấn đề thiếu file giấy phép trong bản phân phối PyPI, cách ly môi trường, v.v. Tất nhiên không hoàn hảo, vì maintainer có thể dùng bot chính thức tự động merge các thay đổi PyPI có ràng buộc phiên bản sai
Vấn đề mà hiện không công cụ nào giải quyết được chủ yếu xoay quanh PyPI. Bạn phải xử lý các gói không có trên conda, và việc phát hành gói trên thực tế gần như bị buộc phải phát hành lên PyPI trước
Ngay cả khi cài một gói chỉ có trên PyPI thông qua conda, một số dependency của nó vẫn có thể có trên conda. Theo tôi biết, không có trình quản lý gói nào dùng các gói conda để thỏa mãn dependency của gói PyPI. Bạn có thể thêm thủ công các gói conda để khớp dependency, nhưng có nguy cơ không được áp dụng đúng các ràng buộc phiên bản
Ngay cả khi viết một gói Python mã nguồn mở, dù cấu hình chỉ phụ thuộc vào kênh conda, phần lớn vẫn phải hoặc nên phát hành lên PyPI trước. Vì việc phát hành trên kênh conda-forge trên thực tế yêu cầu gói phải tồn tại trên PyPI. Vì vậy với những người như tôi, Rye vẫn có thể hữu ích và đáng để xem xét
Tôi rất kỳ vọng vào dự án này, nhưng dự định sẽ chờ đến khi nó đạt mức trưởng thành hơn. Tôi thích mọi thứ khác mà đội Astral đã đưa ra nên kỳ vọng rất lớn
Mỗi lần bắt đầu một dự án Python, tôi lại có cảm giác phải học lại trạng thái mới nhất của việc quản lý dependency/môi trường ảo