Rye:一个实验性质的Python包管理系统
Rye 是Flask的作者Armin Ronacher最近推出的一个实验性质的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尝试对这些问题给出一个解决方案,但也需要不同的系统来支持,目前看还任重道远。
由于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作为第三方库包
但同时也有一个问题:rye会不会是另一个做不到主流的Python包管理系统,从而进一步增加Python包管理的碎片化呢?作者也有这个考虑,因此写了一个讨论帖 Should Rye Exist?来讨论这个问题,同时关于Rye的设计初衷,可以参考这里作者的思考。
个人观点:Rye的出现给Python社区引入了一些新鲜的解决现有问题的思路。使用Rye一段时间后,发现至少使用standalone 的Python版本是一个解决冲突的好的方式。通过几个简单的命令来解决版本管理的问题是比较直观的,提出Rye应该是利大于弊的,也就是有益程度大于碎片化增加的程度。
总之不管是PEP 668中标记版本管理是系统的还是Python的,还是PEP 711来单独下发Python解释器二进制文件,还是Rye的出现,都是Python社区意识到Python包管理问题的严重性,进而做出的一些有益尝试。期待在未来,有更标准化的工具,Python的开发也更容易。
下面将对Rye的安装和使用进行简单介绍。