中文镜像不支持私有包,因其仅缓存公开元数据;私有包需在repositories中显式声明vcs源并置顶,配合auth.json配置凭据,且必须禁用默认源。

packages.json、provider-*.json),**不托管、不索引、不代理任何私有包**。你配了 https://mirrors.aliyun.com/composer/,Composer 依然只会查公开包;私有包 corp/logger 即使存在,也会直接报 Could not find package corp/logger。
根本原因不是镜像“没做全”,而是设计定位不同:中文镜像是为加速公开生态而建的只读缓存,它不接入你的 Git 仓库,也不解析你私有包的 composer.json,更不会生成对应 ZIP 或 provider 数据。
为什么加了中文镜像,私有包还是找不到
因为 composer install 查包分两步:先查元数据(哪个源有这个包名 + 版本),再拉实际代码(dist ZIP 或 source clone)。中文镜像只参与第一步,且只提供 packagist.org 的子集;第二步中,私有包的 dist URL(比如 https://gitlab.corp/logger/-/archive/v1.2.0/logger-v1.2.0.tar.gz)完全不受镜像控制——它由你私有仓库自己暴露,Composer 直连,不走镜像。
- 你在
composer.json里写了"repositories",但把它放在了中文镜像配置之后 → Composer 按数组顺序匹配,先去镜像站找corp/logger,没找到就停了,根本不会往后看你自己的vcs源 - 你用
composer config -g repo.packagist配了阿里云,但项目级composer.json里有"repositories"字段 → 全局镜像被完全忽略,私有源又没写对,结果两头落空 - 你误以为“镜像 = 所有包都走它”,其实
type: "composer"的私有源(如 Satis)和type: "vcs"的 Git 源,必须显式声明在repositories数组里,且不能依赖中文镜像代劳
怎么让私有包和中文镜像共存
必须手动拼装 repositories 数组,把私有源放前面、官方镜像放后面,并显式禁用默认源:
{
"repositories": [
{
"type": "vcs",
"url": "https://gitlab.corp/logger"
},
{
"type": "composer",
"url": "https://mirrors.aliyun.com/composer/"
},
{
"packagist.org": false
}
],
"require": {
"corp/logger": "^1.2",
"monolog/monolog": "^3.0"
}
}
-
"packagist.org": false必须是数组里的独立对象,不能合并进其他项 - 私有
vcs源必须在数组最前,否则corp/logger永远搜不到 - 中文镜像作为第二个源,只服务
monolog/monolog这类公开包;它不干扰私有源逻辑 - URL 末尾必须带
/,否则type: "composer"会静默失效
auth.json 和凭据管理容易被忽略的点
私有 Git 仓库(尤其是 HTTPS)需要认证,但凭据绝不能写进 composer.json,也不能拼在 URL 里(如 https://token:x-oauth-basic@gitlab.corp)——这会导致 Git 凭据泄露或 Composer 解析失败。
-
auth.json文件必须与composer.json同目录,权限设为600(Linux/macOS) - 内容格式要严格:
{"http-basic": {"gitlab.corp": {"username": "deploy", "password": "xxx"}}},字段名大小写敏感 - SSH 方式(
git@gitlab.corp:corp/logger)不依赖auth.json,但要求当前用户已执行ssh-add加载私钥 - 改完
auth.json后,必须运行composer clear-cache,否则旧缓存可能继续用错凭据
repositories 数组的结构和顺序,不是镜像地址本身。中文镜像只是公开包的加速器,私有包永远要靠你自己明确定义来源、验证凭据、并确保 Composer 能按序访问到。











