Composer不支持"type": "plugin"仓库类型,仅内置composer、vcs、package、artifact、path五种;插件是普通包,需通过其composer.json中"type": "composer-plugin"声明,由Composer扫描识别并加载。

Composer 不支持在 repositories 中直接配置“插件仓库”——它没有 type: "plugin" 这种类型,也没有专用于插件的仓库协议。 所有插件(如 composer/installers、phpstan/extension-installer)都只是普通 Composer 包,靠标准的 type: "vcs"、type: "composer" 或默认 Packagist 机制加载,而非走独立插件源通道。
为什么不能写 "type": "plugin" 在 repositories 里
Composer 的 repositories 类型是硬编码校验的,只接受 composer、vcs、package、artifact、path 五种。填任何其他字符串(包括 "plugin")都会触发 Invalid repository type 错误,且后续元数据解析直接中止。插件本身不是一种仓库类型,而是包的一种 type 属性(即 "type": "composer-plugin"),由包自身的 composer.json 声明,与你从哪拉它无关。
插件实际怎么被识别和加载
Composer 在安装阶段会扫描所有已解析的包,检查其 composer.json 中的 "type" 字段。只有值为 "composer-plugin" 的包,才会被载入插件管理器,并执行其 PluginInterface::activate() 方法。这个过程完全不依赖 repositories 的 type 设置。
- 插件包本身可以托管在任意合法仓库:GitHub(
type: "vcs")、私有 Packagist(type: "composer")、甚至本地path - 关键是你 require 的那个包,它的
composer.json必须含"type": "composer-plugin",且"extra"或"autoload"正确指向实现类 - 如果插件未生效,先用
composer show vendor/plugin-name确认是否真装上了;再看composer diagnose是否报 autoload 或 plugin class 加载失败
想让私有插件被项目识别,该配什么 type
取决于插件包的托管方式,不是“插件”身份决定 type:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 插件代码托管在 GitLab 私有仓库 → 配
"type": "vcs",url 填https://gitlab.example.com/myorg/my-plugin.git - 插件已打包进 Satis 或 Private Packagist → 配
"type": "composer",url 填服务地址,如https://packages.myorg.com - 插件正在本地调试 → 配
"type": "path",url 填相对路径,如../my-plugin,并确保minimum-stability允许 dev 版本
无论哪种,都必须显式禁用默认源({"packagist.org": false}),否则可能从 Packagist 拉到同名但不同版本的插件,导致冲突或静默覆盖。
最容易被忽略的点:插件的 autoloading 和依赖链
插件包的 autoload 必须能被 Composer 自动注册,否则 PluginInterface 实现类根本找不到。常见错误:
- 用了 PSR-4 但命名空间与目录结构不匹配,class 文件没被扫到
- 插件依赖了其他库(如
composer-plugin-api),但require写错版本,导致 Composer 启动时就抛出Class not found - CI 环境没清理 vendor/cache,旧插件缓存残留,新版本的
composer.json变更没生效
验证插件是否真正激活,最直接的方式是运行 composer -v,看输出里有没有你的插件名出现在 “Loaded plugins” 列表中——而不是只看 vendor/ 下有没有文件夹。

















