Composer插件需同时满足type为"composer-plugin"、实现PluginInterface、extra.class指向可加载类;2.2+版本须配置allow-plugins;类须注册进autoload_plugins.php;activate()异常需-v查看。

插件装了但 composer -V 没反应,先看它是不是真插件
运行 composer global require vendor/plugin 后什么都没输出,大概率是这个包根本不是 Composer 插件——它只是个普通工具库。插件必须同时满足三个硬性条件:type 字段为 "composer-plugin"、类实现 Composer\Plugin\PluginInterface、且 extra.class 指向一个可自动加载的完整类名(如 "Acme\MyPlugin\MainPlugin")。
验证方式只有一条:composer global show --format=json vendor/plugin,检查输出里 "type" 的值。不是 "composer-plugin",就不会被扫描,装了也白装。
extra.class 写错一个字母(比如 MyPlugin 写成 myplugin),或类文件扩展名用了 .php5,都会静默失败,不报错也不触发。
Composer 2.2+ 默认禁用插件,必须显式允许
从 Composer 2.2 开始,所有插件默认被拦截,composer install 会直接中断并提示 "Plugin installation is disabled"。这不是 bug,而是强制安全策略。
必须在配置中显式放行:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 项目级:在项目根目录
composer.json根级加"allow-plugins": ["vendor/plugin"],大小写敏感,不可通配 - 全局级:编辑
~/.composer/config.json(Linux/macOS)或%APPDATA%\Composer\config.json(Windows),在config下加"allow-plugins": ["vendor/plugin"] - 别写
true或*,这等于放弃控制;漏掉关键插件(如symfony/flex)会导致 recipe 不执行
插件类进了 autoload_plugins.php 才算真正加载
即使 composer global require 成功、type 正确、allow-plugins 也配了,插件仍可能零触发——因为它的类根本没注册进 vendor/composer/autoload_plugins.php。
排查路径很明确:
- 打开
~/.composer/vendor/composer/autoload_classmap.php(全局插件路径),搜索你的插件主类名,确认存在 - 如果不存在,检查插件包自己的
composer.json中autoload配置:PSR-4 映射末尾是否缺反斜杠("My\Plugin\": "src/"✅ vs"My\Plugin": "src/"❌) - 改完代码后,必须删掉
~/.composer/vendor/composer/autoload_*.php,再跑composer dump-autoload,否则旧映射残留 - 加
-v参数重试:composer install -v会打印Loading plugin …和Activating plugin …,没这两行就说明被跳过了
activate() 方法里抛异常或提前 return 就静默失效
插件类进了 autoload_plugins.php,也显示 Activating plugin …,但后续无日志、无效果——大概率是 activate() 方法内部出错了,而 Composer 默认吞掉所有异常。
最省时间的验证方式:
- 在
activate()方法第一行加error_log('plugin activated');或file_put_contents('/tmp/plugin-activated', 'yes'); - 然后执行
composer -V(这是最轻量的主进程启动,能触发插件加载) - 若日志没写入,说明
activate()在构造函数之后、方法体执行前就return或exit了 - 必须加
-v或-vv才能看到activate()抛出的异常堆栈,哪怕只是new \Exception('test')
事件监听写错一个字符(比如用 post-install 代替 ScriptEvents::POST_INSTALL_CMD)也会完全失效,且无任何提示——这类细节最容易被忽略,也最难排查。

















