composer插件必须实现composer\plugin\plugininterface接口并声明”type”: “composer-plugin”,且activate()和deactivate()方法不可省略;路径操作须通过$composer->getconfig()->get()获取,读取composer.json应使用$composer->getpackage();事件监听需在activate()中注册,签名需严格匹配;发布前须限定composer-plugin-api版本并实测兼容性。
Composer插件必须实现 Composer\Plugin\PluginInterface
Composer 插件不是随便写个类就能被识别的,核心约束是必须实现 Composer\Plugin\PluginInterface 接口,并在 composer.json 中声明 "type": "composer-plugin"。否则 Composer 启动时根本不会加载它。
常见错误是只写了类但没实现接口,或者实现了接口却漏了 activate() 和 deactivate() 方法——这两个方法是强制要求的,哪怕空实现也得有。
-
activate()里通常注册事件监听器(如EventDispatcher的post-install-cmd) -
deactivate()一般留空,除非你要清理全局状态 - 插件类构造函数不能依赖未初始化的 Composer 实例;
$composer和$io是activate()的参数,不是构造时传入的
如何在插件中安全访问项目根目录和 composer.json
插件运行时不一定在项目根目录下执行,getcwd() 不可靠。正确方式是通过 $composer->getConfig()->get('vendor-dir') 反推,或更稳妥地用 $composer->getPackage()->getAutoload() 等已解析好的元数据。
想读取当前项目的 composer.json 内容?别直接 file_get_contents('composer.json')——路径可能错,且没经过 Composer 的 schema 校验和 normalize 处理。应该用: