ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

如何开发一个为 Poetry 添加自定义命令的插件?

如何开发一个为 Poetry 添加自定义命令的插件? 如何开发一个为 Poetry 添加自定义命令的插件【免费下载链接】poetryPython packaging and dependency management made easy项目地址: https://gitcode.com/GitHub_Trending/po/poetry如果你的 Poetry 项目流程中有一些个性化操作比如批量检查、生成内部脚本而现有的poetry命令覆盖不了可以为 Poetry 开发一个应用插件给它新增一条自定义命令。按 插件文档 的说明插件就是一个普通的 Python 包包内带上自己的代码、声明对 Poetry 的依赖、并通过 entry point 把插件类注册给 Poetry。Poetry 启动时会自动加载已安装的插件包之后poetry 你的命令名就可以使用了。有一点需要先知道Poetry 没有稳定的公开 API插件通常会访问 Poetry 的内部实现内部方法签名在版本之间可能变化详见后文发布后如何维护。命令插件的注册机制要新增命令或选项插件类需要实现poetry.plugins.ApplicationPlugin接口entry point 组名是poetry.application.plugin该组名与源码 ApplicationPlugin 中的group属性一致。插件被加载后Poetry 会调用activate()方法并传入一个poetry.console.Application实例你在这个方法里把命令注册到application.command_loader上。文档同时提示虽然可以直接写application.add(MyCommand())注册命令但强烈建议改为在 command loader 中注册一个工厂函数这样命令只在真正被调用时才加载有利于保持 Poetry 的启动性能。命令重名时register_factory会抛出CleoLogicError见 CommandLoader所以命令名不要和 Poetry 现有命令冲突。另一条硬性限制插件不得以任何方式移除或修改 Poetry 的核心命令文档中的 warning。第一步编写插件包的 pyproject.toml插件包必须依赖 Poetry。以下pyproject.toml的字段全部取自 docs/plugins.md 中的示例name、version、requires-python和poetry (1.2,2.0)依赖约束按你的目标环境调整[project] name my-poetry-plugin version 1.0.0 # ... requires-python 3.7 dependencies [ poetry (1.2,2.0), ] [project.entry-points.poetry.application.plugin] foo-command poetry_demo_plugin.plugin:MyApplicationPluginentry point 的写法在 pyproject 文档 中有完整说明格式是[project.entry-points.A] B C:DA是插件组名这里填poetry.application.pluginB是插件名可自定义示例中为foo-commandC是 Python 模块导入路径D是 entry point即你的插件类。注意旧版写法[tool.poetry.plugins.poetry.application.plugin]在 docs/pyproject.md 中已被标记为 Deprecated文档建议改用project.entry-points本文后续统一使用后者。第二步实现命令类与插件类下面是 docs/plugins.md 中给出的完整示例代码。CustomCommand定义了一条名为my-command的命令MyApplicationPlugin通过工厂函数把它注册进命令加载器from cleo.commands.command import Command from poetry.plugins.application_plugin import ApplicationPlugin class CustomCommand(Command): name my-command def handle(self) - int: self.line(My command) return 0 def factory(): return CustomCommand() class MyApplicationPlugin(ApplicationPlugin): def activate(self, application): application.command_loader.register_factory(my-command, factory)对照pyproject.toml中的 entry point 检查两点即可poetry_demo_plugin.plugin指向你放上面代码的模块MyApplicationPlugin指向实现ApplicationPlugin的类且register_factory的命令名与CustomCommand.name一致。安装插件到 Poetry 环境插件包安装后Poetry 每次启动都会自动加载。文档给出三条安装路径按你当初安装 Poetry 的方式选择其一方式一poetry self add文档主路径poetry self add poetry-pluginself add会校验插件与当前 Poetry 版本的兼容性并安装插件所需的依赖包。它支持的包规格格式与add命令相同因此也可以指向本地路径或 git 仓库。注意文档警告在 Windows 上self add/self remove可能有问题建议优先用其他方式。不再需要时可用poetry self remove poetry-plugin卸载。方式二pipx inject用 pipx 安装 Poetry 的用户pipx inject poetry poetry-plugin卸载pipx uninject poetry poetry-pluginpipx 1.2.0或pipx runpip poetry uninstall poetry-pluginpipx 1.2.0。方式三直接用 Poetry 虚拟环境里的pip$POETRY_HOME/bin/pip install --user poetry-plugin其中$POETRY_HOME代表 Poetry 虚拟环境的路径不确定 Poetry 装在哪时参考 安装说明。卸载对应pip uninstall poetry-plugin。验证插件已生效安装完成后用文档给出的两条检查确认poetry self show plugins该命令列出当前所有已安装的插件你的插件包应出现在列表中。然后直接运行自定义命令poetry my-command上面的示例代码中handle()会输出一行文本按文档示例这条命令的输出为My command此为文档示例输出实际输出取决于你handle()的实现。可选在开发阶段用项目插件做可编辑迭代Project plugins 一节提供了一条适合插件开发的路径在使用方项目的pyproject.toml中用tool.poetry.requires-plugins声明插件依赖并以路径依赖加develop true的方式以可编辑模式安装[tool.poetry.requires-plugins] my-application-plugin 1.0 custom-plugin {path custom_plugin, develop true}把custom-plugin和custom_plugin换成你的插件名与本地路径即可。当插件尚未安装在 Poetry 自身环境时执行poetry install会把它只针对当前项目安装到项目目录下的.poetry/plugins中改完代码无需重新安装。文档同时警告这种方式可以覆盖 Poetry 自身环境中的同名插件版本但如果插件依赖与 Poetry 自身环境中的包不兼容安装会失败。发布后如何维护文档的 Maintaining a plugin 一节给出了明确的维护建议因为插件依赖的内部实现可能随版本调整Poetry 团队会尽量先弃用再删除但签名仍可能变化作为插件作者应该针对 Poetry 的最新 release 版本测试插件同时考虑对最新 release 分支和 main 分支做测试配置一个定期运行的 CI 任务即使插件本身没有改动也要执行以便第一时间发现会破坏插件的内部变更为下一个 Poetry 版本做好准备。如果你只是想在加载时读取配置或修改包状态而不是新增命令Plugin接口entry point 组poetry.pluginactivate()接收Poetry和IO实例是文档给出的另一条路径但它不涉及命令注册超出本文范围。【免费下载链接】poetryPython packaging and dependency management made easy项目地址: https://gitcode.com/GitHub_Trending/po/poetry创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表