supports()返回false会导致包完全不走自定义安装器,因composer仅在该方法返回true时才调用getinstallpath()等后续流程;必须严格匹配$package->gettype()值,且插件自身composer.json需声明"type":"composer-plugin"并配置extra.installer-types。

supports() 返回 false?包根本没走你的安装器
这是最常被忽略的启动失败点:包压根没触发你的安装器逻辑,不是路径错,是根本没进来。
常见错误现象:Package is not installed in the expected path,但 getInstallPath() 根本没被调用;或者 composer install 完全静默,vendor 下照旧出现包目录。
-
supports()必须严格比对$package->getType()——不是包名、不是 vendor 名、不是文件内容,只看目标包composer.json里"type"字段的值 - 确保目标包明确声明了你支持的 type,例如
"type": "my-framework-module",不能拼错、不能多空格、不能大小写混用 - 插件自身必须声明
"type": "composer-plugin",且在extra.installer-types中列出该 type,否则 Composer 不会把它和你的 installer 绑定 - 别在
supports()里做耗时操作(如读文件、发 HTTP 请求),它会被反复调用,性能敏感
getInstallPath() 报 InvalidArgumentException?路径格式错了
报错信息通常是 Invalid argument: Path must be relative to project root 或直接抛出 InvalidArgumentException,本质是返回值违规。
关键约束:返回值必须是相对路径,且不能以 / 开头,哪怕你写的是 /plugins/my-package 也会炸。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 正确写法示例:
return 'plugins/' . $package->getPrettyName();(注意开头无斜杠) - 绝对路径、
./前缀、Windows 风格反斜杠()都会触发异常;一律用正斜杠/,Composer 内部会自动适配系统 - 路径中可用变量:
{$name}(不含 vendor)、{$vendor}、{$type},但仅限于extra.installer-paths配置;自定义 installer 类中需手动拼接 - 别硬编码
vendor/或web/等目录——从$config->get('vendor-dir')或项目根目录出发计算更安全
install() 执行后文件没复制过去?漏了 filesystem 或权限问题
路径算对了、supports() 也返回 true,但目标目录空空如也。问题不在逻辑,而在文件操作层。
- 必须使用
$filesystem实例操作文件,不能直接用copy()、mkdir()等原生函数——$filesystem提供跨平台兼容性和事务回滚能力 - 确保
$filesystem->ensureDirectoryExists($installPath)在复制前执行,否则可能因目录不存在而静默失败 - 检查当前用户对目标路径是否有写权限;CI 环境下尤其要注意
umask和挂载卷权限 -
isInstalled()缺失或判断宽松会导致重复安装,建议基于目标目录是否存在 + 文件校验(如md5_file())双重确认
插件类 activate() 没生效?三个硬条件缺一不可
Composer 不靠目录结构或文件名识别插件,只认 composer.json 里的元信息。漏掉任一环,插件就静默失效。
-
"type": "composer-plugin"—— 缺了这行,Composer 直接跳过激活流程 -
"extra": { "class": "MyVendor\MyPlugin" }—— 类名必须带完整命名空间,且与autoload配置严格对应 -
"require": { "composer-plugin-api": "^2.9" }—— 版本必须匹配你目标 Composer 主版本(2.x 就不能写^1.0) - 所有实际操作必须放在
activate()方法里:$composer->getInstallationManager()->addInstaller()是唯一注册入口,构造函数里做的事基本无效
真正容易被忽略的是:插件是否被 Composer 加载本身,依赖于 vendor/composer/autoload_psr4.php 是否包含你的命名空间映射——如果 composer dump-autoload 没跑,或者 autoload 配置写错路径,activate() 根本不会被调用,连日志都看不到。










