composer install 报错“could not fetch”通常是 ssh 配置问题而非网络问题,需确保 git clone ssh 地址成功、~/.ssh/config 正确指定 identityfile、composer.json 中 repositories 类型为 vcs 且 url 为完整 ssh 格式(含 .git),并验证包名与仓库 composer.json 的 name 字段严格一致。

composer install 时提示 “Could not fetch https://git.example.com/xxx: failed to open stream”
这通常不是网络问题,而是 Composer 没法通过 SSH 访问私有 Git 仓库。Composer 默认走 HTTPS 协议拉取包,但你的私有仓库只开了 SSH(比如 git@git.example.com:org/pkg.git),而 SSH 密钥没配好或没被 Composer 正确使用。
关键点:Composer 本身不管理 SSH 密钥,它依赖系统级的 git 命令行为。所以问题本质是「本地 git 能否用 SSH 克隆该地址」。
- 先手动运行
git clone git@git.example.com:org/pkg.git,确认能成功;失败就说明 SSH 密钥、~/.ssh/config或权限没配对 - 确保私有包的
composer.json中repositories类型为vcs,且 URL 是 SSH 格式(不是 HTTPS) - 如果用了自定义 SSH 端口或别名,必须在
~/.ssh/config里显式声明 Host,并在 Composer 的仓库 URL 中使用该 Host 名
怎么让 composer 使用特定 SSH 私钥(非默认 id_rsa)
Composer 不接受 --ssh-key 这类参数,它完全复用系统 git 的 SSH 行为。要指定私钥,只能靠 ~/.ssh/config 文件路由。
例如你有一把专用密钥 ~/.ssh/id_rsa_private_repo,对应仓库域名为 git.example.com:
Host git.example.com IdentityFile ~/.ssh/id_rsa_private_repo User git
之后所有对 git@example.com 的 SSH 请求都会自动用这把密钥。无需改 Composer 配置,也不用设环境变量。
- 记得运行
chmod 600 ~/.ssh/id_rsa_private_repo,否则 ssh 会拒绝加载 - 执行
ssh -T git@git.example.com验证配置是否生效(应返回欢迎信息,而非 permission denied) - 如果公司用跳板机或代理,
ProxyJump或ProxyCommand也得写进~/.ssh/config对应 Host 块里
composer.json 里配置私有仓库的正确写法
错误写法是把 HTTPS 地址硬塞进 repositories,却指望它走 SSH;或者漏掉 type: "vcs",导致 Composer 当成包名去 Packagist 查。
正确示例(SSH 地址 + vcs 类型):
{
"repositories": [
{
"type": "vcs",
"url": "git@git.example.com:org/my-package.git"
}
],
"require": {
"org/my-package": "^1.0"
}
}
- URL 必须是完整可克隆的 SSH 地址,不能省略
.git后缀(某些 Git 服务如 Gitea 要求它) - 包名
org/my-package必须和目标仓库中composer.json的name字段严格一致(包括大小写) - 如果仓库是私有的,且未在 Packagist 注册,就别加
"packagist.org": false——这只会禁用全部公共包,不是解决私有授权的办法
为什么 vendor 下的包里没有 .git 目录?还能更新吗?
Composer 默认用 git clone --no-checkout --quiet + git checkout -q 拉取,不保留完整 .git,所以你看不到 vendor/org/my-package/.git。但这不影响后续 composer update——Composer 会缓存仓库元数据(在 ~/.composer/cache/vcs/),并用 git 命令直接操作远程 ref。
不过要注意:
- 如果你手动进
vendor/xxx改了代码又想composer update覆盖,得先git reset --hard,否则会因本地修改冲突失败 - 调试时想看 commit 历史?用
composer show org/my-package --all查可用版本,再composer update org/my-package:v1.2.3切换 - 想强制重新 clone(比如怀疑缓存损坏):删掉
vendor/org/my-package和~/.composer/cache/vcs/https---git.example.com-org-my-package.git/对应目录
真正容易被忽略的是:一旦 SSH 配置出错,Composer 报错往往只显示 “failed to open stream”,不会明确说“SSH key rejected”。这时候别急着改 composer.json,先验证 git clone 是否通。










