poetry 高级包管理和构建工具
一直以来,Python生态中包的依赖管理都是非常粗放和简陋的,传统工具链(pip + virtualenv + setup.py)有着诸多问题,比如多个工具职责分散流程复杂且容易出错,requirements.txt
管理依赖经常出现“我这儿能运行其他人却报错”问题,依赖解析管理也是极其简陋,开发时在虚拟环境中竟然都没有移除包并自动清理其依赖的功能。
Poetry是Python中的一个现代化依赖管理和构建工具,最初由法国程序员Sébastien Eustace在2018年发布,设计上完全借鉴了其它语言的NPM、Maven或是Cargo等系统,能给Python开发带来现代化和工程化的良好体验。
官方网站:https://python-poetry.org/
安装
按照官方文档的指导,我们可以在Linux执行以下命令安装poetry
命令行工具。
curl -sSL https://install.python-poetry.org | python3 -
在Windows下我们可以使用如下PowerShell命令。
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py -
这段命令其实就是加载并执行一个Python脚本,脚本会自动帮我们把poetry
安装好,安装完成后,我们还需要根据提示手动设置环境变量,将可执行文件路径加入PATH
。
如果不想再使用poetry
了,我们可以在Linux执行以下命令卸载。
curl -sSL https://install.python-poetry.org | python3 - --uninstall
类似的,Windows下则使用以下PowerShell命令卸载poetry
。
(Invoke-WebRequest -Uri https://install.python-poetry.org -UseBasicParsing).Content | py - --uninstall
Poetry基本使用
初始化Python项目
我们创建一个文件夹,执行以下命令基于poetry
新建一个项目。
poetry init
执行命令后poetry
会交互式的让我们输入一些项目信息,我们根据实际情况填写即可。
命令执行完成后会生成一个pyproject.toml
配置文件,它和前端项目的package.json
、Java项目的pom.xml
作用是类似的,其中包含了项目的全局描述和依赖信息。
[project]
name = "demo-poetry"
version = "0.1.0"
description = ""
authors = [
{name = "gacfox",email = "gacfox2021@gmail.com"}
]
readme = "README.md"
requires-python = ">=3.10"
dependencies = [
]
[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
build-backend = "poetry.core.masonry.api"
设置项目模式
Poetry项目分为package
模式和non-package
模式,前者用于构建Wheel包等场景,后者用于普通应用程序项目。non-package
模式下项目的name
和version
都是可选的,后续执行poetry install
时只会安装项目的依赖,而不会构建和安装项目本身,如果我们开发的程序不是一个需要发布的Python包,那么应该将其设置为non-package
模式。
[tool.poetry]
package-mode = false
设置PyPI镜像
安装依赖时,在中国大陆地区直接访问PyPI速度较慢,我们可以执行以下命令配置Poetry使用镜像。
poetry source add mirrors https://pypi.tuna.tsinghua.edu.cn/simple/ --priority=primary
命令执行后,会在pyproject.toml
配置文件中写入以下信息。
[[tool.poetry.source]]
name = "mirrors"
url = "https://pypi.tuna.tsinghua.edu.cn/simple/"
priority = "primary"
注:poetry
和pip
工具其实是无关的,它们之间的配置并没有什么继承管理,即使你配置过pip
中安装依赖的镜像地址,poetry
中也需要单独配置。
管理虚拟环境
Poetry内部集成了对Python虚拟环境的管理功能,默认情况下对项目的任何操作都是在虚拟环境中进行的。具体来说,当你管理项目依赖时如果当前已激活了虚拟环境则会使用已激活的虚拟环境,如果没有激活虚拟环境,Poetry会自动创建一个新的虚拟环境。不过Poetry默认会在系统的{cache-dir}/virtualenvs
文件夹下创建虚拟环境,这可能和我们传统的venv
使用方式不同,我们可以执行以下命令配置Poetry在项目根目录下的.venv
文件夹下创建虚拟环境。
poetry config virtualenvs.in-project true
创建并激活虚拟环境
执行以下命令可以打印激活当前虚拟环境的命令,执行这条命令时,如果虚拟环境尚未创建,Poetry会自动进行虚拟环境的创建。
poetry env activate
查看虚拟环境信息
执行以下命令可以显示当前项目虚拟环境的详细信息。
poetry env info
可能输出类似如下信息。
Virtualenv
Python: 3.10.11
Implementation: CPython
Path: H:\workspace-python\demo-poetry\.venv
Executable: H:\workspace-python\demo-poetry\.venv\Scripts\python.exe
Valid: True
Base
Platform: win32
OS: nt
Python: 3.10.11
Path: C:\Program Files\Python310
Executable: C:\Program Files\Python310\python.exe
执行以下命令可以列出当前项目关联的所有虚拟环境。
poetry env list
执行后可能输出类似如下信息,其中激活的虚拟环境被使用(Activated)
标注了。
.venv (Activated)
删除虚拟环境
如果想要删除虚拟环境,可以使用以下命令。
poetry env remove <虚拟环境名>
管理依赖
安装依赖
假如现在我们拿到一个使用Poetry的项目并想尝试运行它,我们肯定需要安装pyproject.toml
中维护的所有依赖,此时执行以下命令即可。
poetry install
在开发中,如果我们想要添加一个Python包,可以执行以下命令。
poetry add <包名>
例如我们可以使用poetry add requests
安装requests
包,执行完成后我们可以观察pyproject.toml
配置文件也自动添加了如下内容。
dependencies = [
"requests (>=2.32.4,<3.0.0)"
]
依赖分组
Poetry支持对依赖分组,我们开发的程序运行时可能依赖一部分包,但开发过程中或是测试过程中可能还需要额外的依赖包,为了节约部署时间和磁盘空间它们无需在生产环境安装,但在开发或是测试阶段是必要的,维护这些依赖这可以使用Poetry的依赖分组功能实现。
poetry add <包名> --group <分组名>
例如执行poetry add pytest --group dev
可以在dev
分组中安装pytest
框架,此时生产环境下我们直接执行poetry install
不会安装dev
分组中的依赖,而在开发环境我们可以使用poetry install --with dev
安装这些依赖。
分组安装的依赖我们会在pyproject.toml
中看到类似如下的配置信息。
[tool.poetry.group.dev.dependencies]
pytest = "^8.4.0"
版本锁定文件
管理项目依赖包时,我们还会发现项目根目录自动生成了一个poetry.lock
文件。poetry.lock
是Poetry使用的版本锁定文件,它用于记录项目中所有依赖包的版本,确保在不同环境中安装相同版本的依赖,我们通常都需要将其提交到版本控制系统,这样其他人安装依赖时Poetry就会自动下载和我们本地完全一致的依赖版本,避免了依赖兼容性问题。