插件测试必须在独立项目中运行,通过path仓库加载本地插件;需确保composer.json含"type":"composer-plugin"和正确extra配置;事件监听必须在activate()内注册且事件名严格匹配;验证需检查副作用、输出及文件生成,而非仅命令是否报错。

插件测试不能在源码目录里跑,必须用独立测试项目加载它——否则根本不会触发 activate() 和事件监听。
怎么让 Composer 在测试中加载未发布插件
别配 vcs 仓库,也别 global require。最干净的方式是:在临时测试项目的 composer.json 里加 path 仓库 + 绝对路径:
{
"repositories": [
{
"type": "path",
"url": "/absolute/path/to/your/plugin"
}
],
"require": {
"your-vendor/your-plugin": "*"
}
}
-
url必须是绝对路径;CI 中用相对路径(比如../plugin)大概率失败 - 插件自己的
composer.json必须有"type": "composer-plugin"和"extra": {"class": "Your\Plugin\Class"} - 如果插件声明了
composer-plugin-api版本(如^2.2),测试项目得用匹配的 Composer 版本,composer self-update检查下
为什么 test 里收不到 event
常见现象:写了 activate(),注册了 Event::PRE_AUTOLOAD_DUMP,但测试时回调完全没执行。
- 事件监听器必须在
activate()方法内注册——构造函数或静态方法里注册无效 - 监听的事件名要完全一致:
ScriptEvents::POST_INSTALL_CMD≠ScriptEvents::POST_UPDATE_CMD - 某些事件只在真实动作发生时触发:
PackageEvents::POST_PACKAGE_INSTALL不会在composer install无新包时触发 - 调试时加一行:
file_put_contents('/tmp/event.log', print_r($event, true), FILE_APPEND),确认是否进入回调
怎么验证插件行为是否生效
不要只看命令有没有报错,要检查副作用和输出结果:
- 执行
composer install --no-cache触发插件激活(--no-cache避免缓存跳过加载) - 运行具体命令:
composer dump-autoload、composer your:custom-command,观察 stdout/stderr - 检查生成文件是否存在、内容是否符合预期(比如是否生成了 stub 文件、是否修改了
vendor/composer/autoload_*.php) - 用退出码断言:
composer dump-autoload && echo "ok" || echo "fail" - 临时 throw 异常能快速暴露调用栈,确认是否走到你写的逻辑分支
最容易被忽略的是:插件类的命名空间和 autoload 配置不一致,导致 class_exists() 返回 false,整个 activate() 都不会执行——连日志都不会写。











