composer插件必须声明"type": "composer-plugin"、主类实现plugininterface、autoload正确映射且通过require安装后运行install/update才生效;全局安装仅影响全局命令,项目级插件须置于根目录require中。

Composer 插件不能通过 composer.json 的 require 直接安装并自动启用——必须声明为 type: composer-plugin,且主类需实现 ComposerPluginPluginInterface,否则 Composer 完全忽略它。
如何让 Composer 正确加载你的插件
Composer 只在两种场景下扫描并加载插件:一是项目根目录的 composer.json 中声明了该包为插件("type": "composer-plugin"),二是该包被全局 require 到 ~/.composer/composer.json 并满足类型和自动加载要求。
- 插件包的
composer.json必须包含"type": "composer-plugin" - 必须通过
"autoload": {"psr-4": {...}}正确映射主类路径,例如"MyVendorMyPlugin\": "src/" - 主类构造函数不能依赖未解析完成的
ComposerComposer实例——activate()方法才是安全入口 - 不要在
composer install过程中执行耗时 I/O 或网络请求,可能阻塞整个安装流程
PluginInterface::activate() 里能做什么
这是插件真正“活起来”的时刻,$composer 和 $io 已就绪,可安全注册事件监听器或修改行为。但注意:此时依赖图尚未锁定,$composer->getPackage() 返回的是 root package 的原始定义,不是最终安装结果。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 用
$composer->getEventDispatcher()->addListener()注册如post-install-cmd、pre-autoload-dump等生命周期事件 - 可通过
$composer->getConfig()->get('bin-dir')获取配置值,但不能调用set()修改运行时配置 - 若需干预 autoloader 生成,监听
autoloader-dump事件比硬改vendor/autoload.php更可靠 - 避免在
activate()中抛出异常——会导致composer install中断,且错误堆栈不友好
为什么 post-autoload-dump 拿不到你新增的 classmap
因为 post-autoload-dump 触发时,autoloader 文件已经写入磁盘;插件若想注入额外 classmap,必须提前在 pre-autoload-dump 阶段通过 $event->getComposer()->getPackage()->getAutoload() 修改 autoload 配置数组,并确保新路径已存在、可被扫描。
- classmap 路径必须是相对于包根目录的相对路径,不能是绝对路径或
../回退 - 修改 autoload 后,需手动调用
$composer->getInstallationManager()->getInstaller('library')->install(...)不行——这是内部逻辑,插件无权触发重装 - 更稳妥的做法:在
pre-autoload-dump中把生成好的 classmap JSON 写入vendor/composer/autoload_classmap.php旁的临时文件,再用脚本 patch,但属 hack 行为,不推荐 - 官方支持方式是让使用者在
composer.json的autoload字段中显式声明,插件只负责验证或报错提示
插件机制本质是 Composer 的「钩子系统」,不是沙箱环境——它共享整个 Composer 进程的内存与状态。任何对 $composer 对象的误操作(比如清空 RepositoryManager)都可能导致后续命令失败,而这类问题往往没有明确错误信息,只表现为“某条命令突然不生效”。










