Python 包管理器比较 📦
介绍
好处
诗
孵化
产品数据管理
黑麦
GitHub 统计信息
结论和要点
这篇文章最初是一个随机的想法,后来在 Mastodon 上发表了这篇文章。
如果您还没有读过2020 年出版的《超现代 Python》,那么它是本文的一个很好的伴侣,而且据说将于 2024 年以书籍形式出版。
介绍
感觉 Python 的打包方式在过去几年里发生了很大变化。我刚开始创建 Python 包的时候,首选的方法是使用setup.py
以及(感觉)一堆需要的随机文件,比如MANIFEST.in
、setup.cfg
等等。我基本上是先找到一个指南,然后等看起来可以正常工作后再到处复制粘贴文件。
我是早期采用它的用户,pipenv
主要原因是它的主要吸引力在于可以保证部署一致性的锁文件。我最初的兴奋让我多次失望,之后我又开始研究其他方案。
我记得Poetry
当时我是个很酷的新贵。它完全避开了setup.py
、requirements.txt
和其他不同的文件——它只有一个pyproject.toml
文件来配置项目,有开发者友好的工具来添加依赖项,一个用于一致部署的锁定文件,以及一个确保依赖树相互兼容的算法(这在pip
当时的那个版本中是无法实现的)。
我爱上了它。虽然确实有一些小瑕疵,也有一些 bug 让我时不时地遇到麻烦,但总的来说,Poetry
它一直是我一段时间以来的首选。
然而,在过去的几年里,Python
打包技术似乎正在经历一个新的创新时代。例如,pip
在 2020 年发布了一个依赖项解析器,现在当依赖项发生冲突时会报错。同样在 2020 年,PEP 621和PEP 631取代了pyproject.toml
成为 Python 软件包的新标准setup.py
。PEP 517和PEP 660为 Python 构建系统创建了标准。
基于这些 PEP,Poetry
不再是唯一具有前瞻性的包管理器。pipenv
仍然存在(并且我认为此时更稳定!),但是Hatch
,,PDM
和Rye
都承诺在创建 Python 包时为开发人员提供愉快的体验。
好处
大多数软件包管理器都秉承“一体化”理念,并提供类似的好处:从命令行添加依赖项、锁定文件、构建和发布软件包。如果您想手动执行这些操作,请参阅“打包 Python 项目”中列出的必要步骤。减少创建新 Python 软件包所需的工具数量意味着只需在一个地方查找文档并保持最新状态。
诗
我的第一个现代 Python 包管理器。我想说它的文档仍然是目前最好的,尽管对某些人来说它可能过于“设计”了。它功能很多——也许太多了?——但在我看来,它开创了许多现在其他 Python 包管理器都期待的功能。我感觉它有时会不等官方 PEP 就推进开发,不过我认为这种情况在过去几年里有所改变。
有时锁定文件不向后兼容,这在团队工作时可能会很困难——每个人都需要Poetry
同时更新他们的安装。
另一个恼人的功能是,它缺少Poetry
其他所有选项都具备的功能,那就是定义“脚本”。例如,poetry run dev
作为 的别名。虽然我使用(一个插件)来提供该功能,poetry run manage.py runserver 0:8000
但在标准 中却不可用。Poetry
poethepoet
Poetry
孵化
Hatch
它始终遵循 Python PEP 标准,并带来了一些创新功能,包括能够将依赖项和脚本分组到自定义环境中。该hatch new [project]
命令出人意料地灵活,并且提供了ruff
(我最喜欢的 Python 新工具)、pytest
和的设置coverage
。我来这里是为了了解所有工具的选择,但如果我不说它有点令人惊讶,那我就是撒谎了。
在 PyPA GitHub 组织的领导下,它可能比其他工具更具官方光彩。
产品数据管理
PDM
不知为何,与其他选项相比,它感觉像是个冷门选项。除了搭建新项目并稍微试用一下之外,我并没有用过太多。Dan Sloan 在 Mastodon 上评论道,它PDM
遵循所有当前的 PEP 标准,对跨平台锁文件有良好的支持,并且还包含一个pdm export
输出标准requirements.txt
文件的实用命令。
黑麦
rye
似乎迅速崛起。它由 Flask 的创始人Armin Ronacher开发,基于他构建Python
软件包的独到方法。这让我想起black
一位受人尊敬的开发人员开发了一个独到的工具,并在社区中引起轰动。这里Rye
也提供了其理念的概述。
Rye
文档中多次警告称,它处于实验阶段,尚未投入生产,尽管我在简单的测试中没有发现任何明显的问题。Rye
与其他选项略有不同,因为它主要将一组其他工具(pip
、pip-tools
等)整合到特定的工作流程中。另一个显著特点是它可以Python
直接处理多个安装版本——Poetry
建议使用pyenv
来处理相同的用例。
GitHub 统计信息
我不认为 GitHub 统计数据特别有用,但星星的数量确实可以表明社区对特定工具的参与度(截至 2023 年 11 月 12 日)。
结论和要点
就我个人而言,我有多个库使用了setup.py
和Poetry
,一个库使用了Hatch
,现在又有一个库使用了Rye
。下一个库可能会使用PDM
。😎 我喜欢尝试新工具,了解它们的工作原理,并改进我的工作流程。
你可能会浏览 Python 打包的所有选项,并被“选择悖论”所困扰。我理解这种观点,但我也欣赏所有这些工具都在做出不同的权衡,并以各自的方式推动着技术的发展。也许在未来的某个时候,会出现一个“被认可的” Python 包管理器,例如 alaNPM
或Cargo
,但我对此表示怀疑。多种选择各有利弊,但总体而言,我倾向于认为它很有用。
我个人并没有广泛使用过每个包管理器。但是,我曾经用每个包管理器从头开始启动一个新项目,完成了一些简单的任务,并通读了所有文档。每个项目都相对成熟,所以你可以选择任何一个包管理器,都可以。标准化pyproject.toml
意味着从一个包管理器转换到另一个包管理器通常只需要更新一些内容TOML
。所以,选择适合你的包管理器(或者全部尝试!),从此提升你的开发者体验。🛠️
照片由Claudio Schwarz在Unsplash上拍摄
文章来源:https://dev.to/adamghill/python-package-manager-comparison-1g98