Composer插件需声明"type": "composer-plugin"并实现PluginInterface,通过Packagist搜索或composer global show --format=json查看;必须全局安装,调试以activate()执行为准。

Composer 插件怎么查?看 composer global show 和 Packagist 搜索
Composer 插件本质是普通 Composer 包,但必须声明 "type": "composer-plugin",且类需实现 Composer\Plugin\PluginInterface。官方不提供插件中心页面,所以得手动筛:
- 在 Packagist 搜索关键词
composer-plugin或具体功能(如phpstan-plugin、depcheck) - 用
composer global show --format=json查已全局安装的插件,确认是否含"type": "composer-plugin" - 注意区分:有些包名带
-plugin但只是工具库(如phpunit/phpunit的扩展),没声明 type 就不算 Composer 插件
怎么安装插件?优先用 composer global require,不是项目级
绝大多数 Composer 插件(比如 hirak/prestissimo、dealerdirect/phpcodesniffer-composer-installer)必须全局安装,否则不会被 Composer 主进程加载。项目级 require 通常无效 —— 因为插件需要在 composer install 生命周期早期介入,而项目依赖是在之后才解析的。
- 正确安装方式:
composer global require hirak/prestissimo
- 如果已用项目级安装,删掉
composer.json里的条目,并运行composer global remove hirak/prestissimo - 确保
COMPOSER_HOME目录可写(默认是~/.composer),否则global命令会失败并报错Could not write to /path/to/composer/home
插件不生效?检查 PluginInterface::activate() 是否被调用
插件是否真正加载,不能只看 composer global show 输出。最直接验证方式是加日志或断点——在插件主类的 activate() 方法里插入 file_put_contents('/tmp/plugin-activated', 'yes');,然后执行任意 composer 命令(如 composer -V)。若文件没生成,说明插件根本没被扫描到。
- 常见原因:插件包的
autoload配置错误,导致类无法自动加载;或extra.plugin-class在composer.json中拼写错误 - Composer 仅扫描
vendor/composer/autoload_psr4.php中注册的命名空间,插件类必须能被 PSR-4 正确定位 - 使用
composer diagnose可发现部分加载问题,但它不会报“插件未激活”,只提示 autoload 或配置异常
自己写插件时,Capability 和事件监听别硬编码路径
插件通过 $composer->getPluginManager()->addCapability() 注册能力(如 CommandProvider),或监听 PackageEvents::POST_PACKAGE_INSTALL 等事件。但路径和事件名容易写错:
-
CommandProvider要求返回数组,每个元素必须是完整类名(如'MyPlugin\Commands\MyCommand'),不能是相对路径或短名 - 事件常量在
Composer\Plugin\Capability\CommandProvider等接口中定义,不要手敲字符串(如"command"),否则类型不匹配 - 监听事件时,用
$event->getOperation()->getPackage()获取包信息,而不是直接读$composer->getPackage()—— 后者是 root package,不是当前操作的目标包
activate() 是否执行,比翻文档更快。










