作者:YunfengWang
来源:https://vra.github.io/2023/05/17/rye-intro
Rye[1] 是 Flask 的作者 Armin Ronacher[2] 最近推出的一个实验性质的 Python 包管理系统,目的是解决 Python 包管理目前面临的工具链碎片化的问题。
大家知道,Python 目前的包管理系统很多,包括 poetry、pip、pipenv、pyenv、venv、virtualenv、pdm、hatch 等等,它们都是优秀的工具,提出时都是解决了一定的问题,但没有哪个工具能够做到主流,因此也增加了系统的碎片化程度。
另一方面,conda 等工具能提供不同版本的 Python,管理不同的环境,但每个环境的 Python 不是共享的,环境创建一多,环境目录就变得很大,且内部机制很不透明,有时也会遇到冲突没法解决的问题。
另一方面,Python 在 Linux/macOS 上的安装也面临一些问题,例如用包管理器安装的 Python 和用户手动安装的 Python 有的时候会混淆,导致一些混乱,例如在 Fedora 上,用 pip install 安装包可能会导致系统的包管理命令 dnf 出错。PEP 668[3] 尝试对这些问题给出一个解决方案,但也需要不同的系统来支持,目前看还任重道远。
由于 Armin 也是一个 Rust 开发者,而 Rust 基于标准化的 rustup 和 cargo 两个工具,配合配置文件来进行包管理,目前做的比较好,没有 Python 面临的碎片化问题。受 Rust 的启发,作者提出了 Rye,并且期望能够启发 Python 社区提出类似 Rust 的标准包管理工具。
具体来说,Rye 提出了一些解决这些问题的思路:
-
提出一个 workspace 的概念,workspace 类似一个项目目录,或者一个 git 仓库,一个 workspace 下只有一个 Python 版本,不同 workspace Python 版本相互隔离,每个项目采用 pyproject.toml 来进行配置
-
不使用系统自带的 Python,相反地,在每个项目目录的中下载一个 standalone 的 python,解决不同版本的冲突问题 + 不暴露 pip 命令,通过 rye add + rye sync 来管理包的依赖,避免包 A 和包 B 依赖不同版本的包 C 而导致的不兼容问题
-
区分开发环境和正式环境,因为一些包在开发时会用到一些调试工具,但作为第三方库被引入的时候并不需要
-
支持 import 本地 workspace 作为第三方库包
但同时也有一个问题&