自定义 composer 仓库驱动必须完整实现 vcsdriverinterface 接口,包括 getbranches()、gettags()、getdist() 等全部方法,返回类型严格匹配,且需通过插件在 activate() 中调用 repositorymanager::addrepositoryclass('vcs', myvcsdriver::class) 注册,repositories 的 type 字段必须为 "vcs"。

自定义 Composer 仓库驱动必须实现 VcsDriverInterface,否则无法被识别;type 字段仍得写 "vcs",不能改成任意字符串。
为什么 VcsDriverInterface 是硬性门槛
Composer 启动时会遍历所有已注册的 VCS 驱动类,逐个调用其 supports() 方法判断是否匹配当前 URL。一旦匹配,就实例化该驱动并调用 getBranches()、getTags()、getDist() 等方法——这些全是 VcsDriverInterface 强制声明的抽象方法,少一个就会在初始化阶段直接报错(Fatal error: Class must implement…)。
常见错误现象:composer install 报 Call to undefined method MyDriver::getTags(),其实是接口没完整实现,不是配置或路径问题。
- 接口定义在
Composer\Repository\Vcs\VcsDriverInterface,必须全量实现,不可只覆盖部分方法 - 返回值类型必须严格匹配:例如
getBranches()必须返回array<string string></string>(分支名 → commit hash) - 异常处理要主动抛
InvalidRepositoryException或TransportException,不能静默返回空数组
如何让 Composer 加载你的驱动类
靠插件机制注册,不是靠 autoload 自动加载就能生效。必须在插件的 activate() 方法里显式调用 RepositoryManager::addRepositoryClass():
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
use Composer\Plugin\PluginInterface;
use Composer\Repository\RepositoryManager;
use Composer\IO\IOInterface;
use Composer\Composer;
class MyVcsPlugin implements PluginInterface
{
public function activate(Composer $composer, IOInterface $io)
{
RepositoryManager::addRepositoryClass('vcs', MyVcsDriver::class);
}
}
注意:addRepositoryClass() 第一个参数必须是 'vcs',哪怕你支持的是 nas:// 或 gitlab-ssh:// 协议——协议识别靠 URL 前缀和 supports() 判断,跟 type 字段无关。
- 插件类必须实现
PluginInterface,否则 Composer 完全忽略它(无报错、无声无息) -
composer.json中需声明"type": "composer-plugin"且"extra"里不能漏掉"class"入口 - 本地测试时,要用
path类型 repository 引入插件,并运行composer dump-autoload
repositories 配置里 type 为什么只能是 "vcs"
因为 Composer 的仓库分发逻辑不看 type 字段内容,只认内置枚举值。你在 composer.json 里写:
"repositories": [
{
"type": "vcs",
"url": "nas://my-private/pkg"
}
]
Composer 就会把 nas://... 丢给所有已注册的 VCS 驱动,挨个问:“你 supports 这个 URL 吗?”只有你的 MyVcsDriver::supports() 返回 true,才会真正启用它。
- 写
"type": "nas"或"type": "my-protocol"—— 直接被跳过,连supports()都不会调用 - URL 前缀必须与
supports()中的判断逻辑一致,比如你的方法里检查strpos($url, 'nas://') === 0,那 URL 就不能写成http://nas.example.com/pkg - 多个自定义协议可共存,只要各自驱动的
supports()不冲突即可
最容易被忽略的一点:驱动类里的 getDist() 和 getSource() 方法,必须返回真实可用的 ZIP 下载地址或 Git 克隆地址,且权限要与运行 composer install 的用户一致——否则安装中途卡住或报 Failed to download,但错误堆栈里根本看不到你的驱动代码行号。










