必须传'vcs',因为Composer内部硬编码仅通过该type触发驱动分发逻辑;协议识别实际由supports()方法依据URL前缀判断,与注册名无关;若误传'gitlab-ssh'等则驱动永不调用。

为什么 addRepositoryClass('vcs', MyVcsDriver::class) 必须传 'vcs'?
因为 Composer 内部只认 vcs 这个 type 字符串来触发 RepositoryManager 的驱动分发逻辑,哪怕你实际支持的是 nas:// 或 gitlab-ssh:// 协议——协议识别完全靠 URL 前缀和 supports() 方法返回值,跟注册时传的 type 名字无关。
常见错误是误以为 type 应该匹配协议名,比如写成 'gitlab-ssh' 或 'nas',结果插件注册成功但驱动从不被调用,supports() 根本不会执行。
- 必须用
'vcs',这是硬编码在RepositoryManager::createRepository()里的分支判断依据 -
MyVcsDriver::supports()里才做真实协议识别:检查$url是否以nas://开头、是否含@gitlab.internal等 - 若
supports()返回 false,Composer 会跳过该 driver,继续尝试下一个(比如默认的 GitDriver)
怎么让自定义 VCS Driver 被 Composer 真正加载?
光注册 driver 不够,插件类还必须满足三个硬性条件,缺一不可,否则静默失效:
- 插件类必须实现
PluginInterface接口,且activate()和deactivate()方法不能缺失(哪怕空实现) -
composer.json中必须声明"type": "composer-plugin",且"extra"里明确指定入口类:"class": "MyVcsPlugin" - 本地测试时,不能直接
composer require插件包,而要用path类型 repository 引入:"repositories": [{ "type": "path", "url": "./plugins/my-vcs-plugin" }],再运行composer dump-autoload
漏掉任意一项,activate() 都不会被调用,addRepositoryClass() 更不会执行——没有报错,也没有日志,就像没装过一样。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
自定义 Repository 的 type 写错会导致什么?
写错 type 是最常导致 Could not find package xxx 的原因,不是网络问题,而是 Composer 根本没走你的仓库。
-
vcs:仅用于 Git/SVN/Mercurial,必须带url字段,且内容是有效仓库地址(如https://git.internal/foo) -
package:用于单个离线包,必须手动声明version、dist、source,漏一项就解析失败 -
path:路径必须相对项目根目录,不能含../向上跨级,否则 Composer 直接拒绝加载 -
composer:URL 必须以/结尾,且该地址要能返回合法packages.json,写成https://satis.internal/packages.json就 404
注意:type 错误不会报“type 不支持”,而是表现为包找不到或版本约束无法解析——因为 Composer 在匹配阶段就跳过了你的仓库条目。
为什么私有仓库总被 packagist.org 覆盖?
不是配置没生效,是 Composer 查找包时按 repositories 数组顺序遍历,一旦在某个仓库找到同名包,立刻停止搜索。默认 packagist.org 是内置源,优先级高于你写的任何配置。
- 必须把私有仓库放在
repositories数组**第一位** - 必须显式禁用官方源:
{ "packagist.org": false },这一项要单独作为数组中的一项,不能塞进其他仓库对象里 - 如果还想 fallback 到 packagist.org,得加一项:
{ "packagist.org": true },且必须放在数组**末尾**
容易被忽略的一点:禁用语句写在 config 下或嵌套在某个仓库对象的 options 里,完全无效;它必须是 repositories 数组里一个独立的、键名为 "packagist.org" 的对象。


















