Composer自定义安装器必须实现InstallerInterface接口,否则不会被识别;需在composer.json中声明"type": "composer-installer",并实现supports()和install()等方法,且正确配置autoload与插件注册。

Composer 自定义安装器必须实现 InstallerInterface
不实现这个接口,Composer 根本不会识别你的类为安装器——哪怕类名对、命名空间对、autoload 也配好了,照样被忽略。Composer 在加载安装器时只认这个契约,其他都是空谈。
常见错误现象:Package is not installed in the expected path 或根本没触发自定义逻辑,本质是 Composer 压根没调用你的类。
- 必须在包的
composer.json中声明"type": "composer-installer"(不是library) - 类需实现
Composer\Installer\InstallerInterface,且至少提供supports()和install()两个方法 -
supports()返回true时,Composer 才会把该包交给你处理;返回false就走默认流程 - 别漏掉
update()和uninstall()——虽然 Composer 不强制,但缺了会导致升级/卸载失败,用户会报错
怎么让 supports() 精准匹配你的包类型
靠硬编码判断 $package->getType() 最直接,但容易踩坑:如果包没设 type,或设错了(比如写成 wordpress-plugin 而不是你期望的 wp-plugin),supports() 就会返回 false,包被扔进 vendor/ 里不动。
使用场景:你想把所有 type: "laravel-package" 的包装进 vendor/laravel/,而不是默认的 vendor/xxx/yyy。
- 优先用
$package->getType() === 'your-custom-type',别依赖包名或 vendor 名做判断 - 如果必须按包名匹配(比如只处理
acme/*下的包),记得加strpos($package->getPrettyName(), 'acme/') === 0防止误伤 - 别在
supports()里做文件 I/O 或网络请求——它会被频繁调用,性能敏感
install() 里路径操作必须用 IOInterface 和 Filesystem
手动拼接路径 + mkdir/copy 是最常见翻车点:Windows 路径分隔符、权限问题、符号链接处理、相对路径解析错位……全在这儿爆雷。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
正确做法是复用 Composer 自带的工具类:
- 用
$filesystem->ensureDirectoryExists($targetDir)替代mkdir -p - 复制文件用
$filesystem->copy($source, $target, true)(第三个参数启用覆盖) - 获取目标路径时,从
$config->get('vendor-dir')出发,别写死./vendor - 日志输出必须走
$io->writeError("..."),否则在 quiet 模式下看不到任何提示
示例片段:
$targetDir = $config->get('vendor-dir') . '/my-plugins/' . $package->getPrettyName();
为什么 composer install 不触发你的安装器
最常被忽略的是 autoload 配置和插件注册——你的安装器类写了,Composer 却压根没加载它。
典型现象:运行 composer install 完全静默,包照常进 vendor/,install() 一行都没执行。
- 确保你的安装器包(比如
acme/composer-installer)已通过composer require --dev acme/composer-installer装在根项目里 - 根项目的
composer.json必须有"extra": {"installer-paths": {}}或类似配置,但这只是辅助;真正关键的是插件是否被识别 - 检查
composer show --plugins输出里有没有你的包名——没有就说明 autoload 或 type 声明失败 - Composer 2.2+ 默认禁用未签名插件,如果本地开发,加
--no-plugins反而绕过验证,但上线前必须解决签名或白名单问题
复杂点在于:安装器本身是插件,而它控制的又是其他包的安装路径。两层抽象叠在一起,任意一环断开,整个链路就失效。调试时先盯住 composer show --plugins 和 composer install -v 的输出,别急着改逻辑。

















