插件未被 composer 扫描到的首要原因是 type 字段未设为 "composer-plugin";其次需满足主类实现 plugininterface 且 extra.class 指向可自动加载的完整类名,还需在 allow-plugins 中显式放行,并确保类被写入 autoload_plugins.php,activate() 异常须用 -v 查看堆栈。

插件没被 Composer 扫描到?先验 type 和 extra.class
装了插件但 composer -V 没反应、命令不出现,大概率它根本没被识别为插件。Composer 只扫描满足三个硬性条件的包:type 字段必须是 "composer-plugin";主类必须实现 Composer\Plugin\PluginInterface;且 extra.class 必须指向一个可自动加载的完整类名(如 "Acme\MyPlugin\MainPlugin")。
验证方式只有一条:composer global show --format=json vendor/plugin,检查输出里 "type" 的值。不是 "composer-plugin",就不会进扫描队列。
常见静默失败点:
-
extra.class写错大小写(MyPluginvsmyplugin) - 类文件扩展名用了
.php5或.inc,autoload 不识别 - PSR-4 映射路径和实际文件位置不一致,类名存在但无法加载
Composer 2.2+ 默认拦截所有插件:allow-plugins 是开关,不是可选项
从 Composer 2.2 开始,插件默认被禁用,composer install 会直接中断并提示 "Plugin installation is disabled"。这不是 bug,是强制安全策略。必须显式放行:
项目级:在项目根目录 composer.json 根级加 "allow-plugins": ["vendor/plugin"],大小写敏感,不可通配;
全局级:编辑 ~/.composer/config.json(Linux/macOS)或 %APPDATA%\Composer\config.json(Windows),在 config 下加同字段。
别写 true 或 * ——这等于放弃控制;漏掉关键插件(如 symfony/flex)会导致 recipe 不执行。
类进了 autoload_plugins.php 才算真正激活
即使 composer global require 成功、type 正确、allow-plugins 也配了,插件仍可能零触发——因为它的主类根本没注册进 vendor/composer/autoload_plugins.php。
排查路径很明确:打开 ~/.composer/vendor/composer/autoload_classmap.php(全局插件路径),搜索你的插件主类名,确认存在;再检查 autoload_plugins.php 是否包含该类的 require 行。
如果不存在,说明 Composer 没把它当插件加载,哪怕类文件物理存在也没用。此时要回溯前两步:type 是否对、extra.class 是否可解析、autoload 配置是否覆盖到该类路径。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
activate() 报异常?加 -v 看真实错误堆栈
插件类被加载后,Composer 会调用其 activate() 方法。这个方法里任何未捕获的异常都会导致插件静默失效,且不报错——除非你加 -v。
运行 composer -v 或 composer install -v,错误堆栈会完整打出,常见问题包括:
- 依赖的扩展缺失(如插件要用
ext-curl,但当前 PHP 未启用) - 调用了不存在的 Composer API 方法(如误用已废弃的
getPackage()) - 类内引用了未声明的命名空间或未
require的辅助文件
这类问题不会出现在 composer global require 过程中,只在插件真正激活时爆发。不加 -v,你永远看不到它卡在哪一行。










