直接运行composer config repositories查看输出是否含私有源URL;若缺失,说明未正确写入composer.json根级repositories字段,或遗漏{"packagist.org": false}、URL缺尾斜杠等关键配置。

composer config repositories 输出是否含私有源 URL
直接运行 composer config repositories(在项目根目录),看输出里有没有你配的私有仓库地址。如果没出现,说明配置根本没写进 composer.json,或者写错了位置——repositories 必须是顶级字段,不能嵌套在 config、scripts 或其他对象里。
- 常见错误:把
{"type": "composer", "url": "https://pkg.myorg.com/"}写进了config.repositories而非根级repositories - 漏掉
{"packagist.org": false}这个独立对象,导致 Composer 仍优先查官方源 - URL 少了末尾
/,例如写成https://pkg.myorg.com,结果请求/packages.json时变成https://pkg.myorg.com/packages.json→ 404
composer -vvv require 是否命中私有域名
执行 composer -vvv require myorg/internal-sdk(用你私有包的真实名),滚动日志里找 Downloading 或 GET 行。真正生效的表现是:出现类似 GET https://pkg.myorg.com/packages.json 或 Downloading https://pkg.myorg.com/dist/myorg-internal-sdk-1.2.3.zip 的请求地址。
- 如果日志里只有
https://repo.packagist.org或镜像站地址,说明私有源完全没被访问——大概率是"packagist.org": false缺失,或它没放在repositories数组末尾 -
composer search不走私有源,它只查packagist.org全局索引,不能用来验证私有源是否生效 - 加
-vvv是必须的;不带详细日志,你就看不到真实请求路径
auth.json 是否匹配私有源 host
私有源若需认证,auth.json 文件中 http-basic 的 key 必须和仓库 URL 的 host 完全一致(协议、端口、大小写都算)。比如仓库是 https://pkg.myorg.com/,那 auth.json 里必须是 "pkg.myorg.com",写成 "https://pkg.myorg.com" 或 "myorg.com" 都不认。
-
auth.json默认路径是~/.composer/auth.json(全局)或项目根目录下的auth.json(仅限当前项目) - Linux/macOS 下权限必须是
600,否则 Composer 会静默忽略该文件 - 验证方式:运行
composer -vvv require myorg/internal-sdk 2>&1 | grep "Authentication",能看到Using HTTP basic authentication for pkg.myorg.com才算成功触发认证
私有包安装后如何确认 vendor 未被篡改
安装完不能只看 vendor/ 目录存在就放心。composer install --dry-run 是最直接校验方式:它跳过实际安装,只比对 composer.lock 与 vendor/ 是否完全一致,输出中出现 Nothing to install or update 才说明一切正常。
- 更严格的做法是先清缓存再重装:
composer clear-cache && composer install --no-cache,强制从私有源重新拉取并校验 -
composer.lock中的dist.shasum是对原始 zip/tar 包算的 sha256,不是对解压后目录内容;所以别手动去vendor/里挨个算子目录哈希 - 如果你改过
vendor/里的代码(比如临时 patch),composer install --dry-run会立刻报错,提示文件不匹配——这是设计使然,不是 bug
最容易被忽略的是:改完 composer.json 或 auth.json 后,不执行 composer clear-cache,缓存里的旧元数据会持续干扰后续请求,导致你以为配置生效了,其实还在走老路。











