在 composer.json 的 repositories 数组中添加 type 为 "vcs" 的对象即可引入 Git 仓库作为包源,需确保 url 格式正确、name 字段与 require 一致,并显式禁用 packagist.org 才能强制走自定义源。

怎么在 composer.json 里加一个 Git 仓库当包源
直接在 repositories 数组里写个 type 为 vcs 的对象就行,composer 会自动识别 Git 协议、SSH 路径或 HTTPS 地址。
常见错误是把仓库地址写进 require,或者漏掉 type 字段——没这个字段,composer 就当普通 Packagist 包处理,根本不会去拉你的 Git 仓库。
-
type必须是vcs(不是git、github或其他) - URL 支持
https://、git@、ssh://,但别混用凭证方式(比如 HTTPS 配 token 又写私钥路径) - 如果仓库没标准
composer.json,得确保它有合法的name和version(或通过dist/source手动指定)
"repositories": [
{
"type": "vcs",
"url": "https://github.com/your-org/your-private-package"
}
]
为什么 require 的包死活不从自定义仓库安装
composer 默认优先走 packagist.org,除非你声明的包名和自定义仓库里的 name 完全一致,且该包在 Packagist 上不存在(或被显式禁用)。
更常见的原因是:你写的 name 在 Packagist 上已有同名包,composer 就直接忽略你的 VCS 源——它不会“覆盖”,只会“跳过”。
- 检查
composer show your-vendor/your-package是否能列出,不能就说明没命中 - 运行
composer install -vvv,看日志里有没有 “Reading repository” 对应你的 URL - 确认你的仓库根目录下
composer.json的name字段和require中写的一致,比如"name": "acme/utils",require 就得写"acme/utils": "dev-main"
用 SSH 连私有 Git 仓库时总报 authentication failed
不是 composer 的问题,是 PHP 进程启动时没读到你的 SSH agent 或私钥权限不对。
关键点在于:composer 调的是系统 git 命令,所以得让 git clone 在当前环境下能跑通,否则 composer 一定失败。
- 先手动执行
git clone git@github.com:your-org/repo.git,成功了再试 composer - 如果用 Docker 或 CI 环境,确保
~/.ssh/config和私钥已挂载,且权限是600 - 避免在
url里硬编码用户名(如git@host:user/repo),git 本身不认这种写法;正确格式是git@host:user/repo.git
想让某个包只从 VCS 装,彻底屏蔽 Packagist
可以,但得靠 packagist.org 的 repository 配置开关,不是靠删掉默认源。
composer 默认内置了 packagist.org 作为第一个仓库,只要它存在,就会参与包匹配。要禁用,必须显式把它设为 false。
- 在
repositories数组最前面加一个{"packagist.org": false}类型的条目 - 之后所有包都只能从你列出来的 VCS 或其他自定义源里找,包括
monolog/monolog这种通用包——没手动加,就装不上 - 如果只想屏蔽某几个包,不如用
replace或provide,但那是另一层逻辑了
"repositories": [
{
"packagist.org": false
},
{
"type": "vcs",
"url": "https://gitlab.example.com/internal/utils"
}
]
实际配的时候,最常卡住的不是语法,而是仓库的 composer.json 缺 version 字段、SSH 权限没透传、或者以为写了 VCS 就能绕过 Packagist 的索引规则。这些地方一错,composer 就静默跳过,连 warning 都不给。










