
如何把 tool.poetry 配置的 Poetry 项目迁移到 PEP 621 project 段【免费下载链接】poetryPython packaging and dependency management made easy项目地址: https://gitcode.com/GitHub_Trending/po/poetry如果你的 Poetry 项目还只用[tool.poetry]段声明元数据和依赖想把项目迁移到 PyPA 标准的 PEP 621[project]段Poetry 官方文档给出的做法是手动改写pyproject.toml把标准元数据挪到[project]段把仅 Poetry 专用的配置留在[tool.poetry]段。迁移不需要一次性完成——Poetry2.0.0同时兼容两种配置你可以按自己的节奏决定是否迁移。迁移前的前提项目当前由pyproject.toml中的[tool.poetry]段管理poetry new/poetry init生成的老项目就是这种形态。建议在[tool.poetry]段中加入requires-poetry 2.0这样低于 2.0 的 Poetry 版本操作该项目时会直接报错避免老版本无法解析新配置[tool.poetry] requires-poetry 2.0文档以项目foobar为例演示迁移原始配置如下来自 docs/faq.md 的迁移示例[tool.poetry] name foobar version 0.1.0 description authors [Baz Qux baz.quxexample.com] readme README.md packages [{ include awesome, from src }] include [{ path tests, format sdist }] homepage https://python-foobar.org/ repository https://github.com/python-foobar/foobar documentation https://python-foobar.org/docs keywords [packaging, dependency, foobar] classifiers [ Topic :: Software Development :: Build Tools, Topic :: Software Development :: Libraries :: Python Modules, ] [tool.poetry.scripts] foobar foobar.console.application:main [tool.poetry.dependencies] python ^3.13 httpx ^0.28.1 [tool.poetry.group.dev.dependencies] pre-commit 2.10 [tool.poetry.group.test.dependencies] pytest 8.0 [build-system] requires [poetry-core2.0.0,3.0.0] build-backend poetry.core.masonry.api字段迁移对照哪些字段搬到 [project] 段迁移的核心是按 docs/pyproject.md 中的字段说明逐项搬运。字段在[tool.poetry]段中标注为 Deprecated 的都有对应的project.*替代项常见映射如下原[tool.poetry]字段迁移后位置注意事项nameproject.name使用[project]段时必填versionproject.version使用[project]段时必填若用poetry build --local-version或插件动态设版本则把version加入dynamic基础版本留在[tool.poetry]descriptionproject.description—authorsproject.authors格式变化由字符串Name email改为表{ name ..., email ... }readmeproject.readme需要多个 README 时把readme加入dynamic并留在[tool.poetry]homepage/repository/documentationproject.urls三个 URL 统一收进[project.urls]子表keywordsproject.keywords—licenseproject.licenseSPDX 表达式如license MIT旧的{ file LICENSE }写法应改用license-files[tool.poetry.scripts]console 脚本project.scripts仅type file的文件脚本仍留在[tool.poetry.scripts][tool.poetry.extras]project.optional-dependencies—[tool.poetry.plugins]project.entry-points—python ^3.13在[tool.poetry.dependencies]中project.requires-python 3.13^3.13展开后即3.13,4.0.0见下文Python 版本约束必须留在[tool.poetry]段的配置PEP 621 没有对应位置或文档明确要求留在该段packages、include/exclude打包的包发现与文件包含规则只属于[tool.poetry]classifiers如果你希望 Poetry 根据 Python 版本范围自动生成 Python 分类器必须把classifiers加入[project]的dynamic列表并把分类器写在[tool.poetry]段静态写在project.classifiers则不会自动补全依赖组main组之外如dev、test的依赖仍声明在[tool.poetry.group.组名.dependencies]也可以用 PEP 735 的[dependency-groups]见 docs/managing-dependencies.mdrequires-poetry、requires-plugins、build-constraints等 Poetry 专用配置。依赖的两种迁移方式依赖部分有两条文档给出的路径二选一示例同样来自 docs/faq.md方式一动态依赖推荐保留 Poetry 丰富的依赖语法把dependencies加入[project]的dynamic列表主依赖继续用 Poetry 表格语法写在[tool.poetry.dependencies][project] name foobar version 0.1.0 description authors [ { name Baz Qux, email baz.quxexample.com } ] readme README.md requires-python 3.13 keywords [packaging, dependency, foobar] # classifiers 设为 dynamic让 Poetry 按 Python 版本范围自动生成分类器 # dependencies 设为 dynamic保留 Poetry 的依赖定义格式 dynamic [classifiers, dependencies] [project.urls] homepage https://python-foobar.org/ repository https://github.com/python-foobar/foobar documentation https://python-foobar.org/docs [project.scripts] foobar foobar.console.application:main [tool.poetry] requires-poetry 2.0 packages [{ include foobar, from src }] include [{ path tests, format sdist }] classifiers [ Topic :: Software Development :: Build Tools, Topic :: Software Development :: Libraries :: Python Modules, ] [tool.poetry.dependencies] httpx ^0.28.1 [tool.poetry.group.dev.dependencies] pre-commit 2.10 [tool.poetry.group.test.dependencies] pytest 8.0 [build-system] requires [poetry-core2.0.0,3.0.0] build-backend poetry.core.masonry.api方式二静态依赖完全采用 PEP 508 字符串主依赖写成[project]段的dependencies字符串列表。注意^和~约束不支持写在project.dependencies中必须展开成区间^0.28.1写作httpx (0.28.1,0.29.0)^与~的等价区间表见 docs/dependency-specification.md[project] # ...元数据同上 dynamic [classifiers] dependencies [ httpx (0.28.1,0.29.0) ]两种方式的共同规则project.dependencies用于构建 sdist/wheel 时的元数据如果某个依赖需要额外的锁定信息例如source、相对路径依赖就同时保留[tool.poetry.dependencies]来补充对应依赖——project.dependencies只支持绝对路径相对路径依赖必须留在tool.poetry段见 docs/dependency-specification.md。Python 版本约束的处理原配置中[tool.poetry.dependencies]里的python ^3.13迁移为project.requires-python 3.13。如果你需要在锁定时保留上界、又不想把上界写进包元数据文档给出的做法是requires-python不写上界上界写在[tool.poetry.dependencies]的python中[project] requires-python 3.7 # 用于构建时的元数据 [tool.poetry.dependencies] python 3.7,3.11 # 用于锁定依赖约束两处同时指定时tool.poetry.dependencies的python版本范围必须是project.requires-python允许范围的子集否则会报错见 docs/pyproject.md。验证迁移结果运行poetry check它会校验pyproject.toml内容并对照poetry.lock检查一致性对已废弃的字段即还留在[tool.poetry]段的 name、authors、homepage 等旧字段打印警告加--strict可以把警告也当作失败--lock选项则额外验证 lock 文件存在见 docs/cli.md。如果迁移中新增或修改了 console 脚本运行poetry install让脚本在项目虚拟环境中生效。依赖关系变化后例如从表格约束改为 PEP 508 区间按常规流程重新poetry lock/poetry install即可验证项目能正常解析安装。限制与注意事项迁移无法完全自动完成文档明确说一些对pyproject.toml的手工修改不可避免main之外的依赖组dev、test 等不能声明在[project]段只能留在[tool.poetry.group.*.dependencies]或用 PEP 735 的[dependency-groups]静态写法下project.classifiers不会自动补 Python 分类器需要自动补全时请走dynamic [classifiers][tool.poetry].classifierslicense { text MIT }之类的表格式写法已废弃应改为 SPDX 字符串许可证文件改用license-files迁移期间 Poetry 会容忍新旧两种写法并存所以建议用poetry check的废弃字段警告作为迁移完成度的检查依据。【免费下载链接】poetryPython packaging and dependency management made easy项目地址: https://gitcode.com/GitHub_Trending/po/poetry创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考