Composer无“白名单”配置,需通过repositories数组顺序+{"packagist.org": false}实现限制:私有源须置首、官方源须禁用、私有源packages.json必须返回200及合法JSON。

Composer 没有“白名单配置”这个概念,所谓“白名单”其实是靠 repositories 数组顺序 + {"packagist.org": false} 组合实现的硬性拦截逻辑。
为什么不能写 "whitelist" 或 "allow-list"
Composer 配置文件里不存在 whitelist、allow-list、only 这类字段。所有“只允许从某几个源装包”的效果,都必须通过两个动作达成:把私有源放在 repositories 数组最前面,再在数组末尾加一项 {"packagist.org": false}。漏掉任意一个,就会回退到官方源。
- 写成
"whitelist": ["myorg/*"]或"allowed-repos": [...]—— Composer 直接忽略,不报错也不生效 - 只禁用 packagist 但没把私有源放第一位:私有源根本不会被查询(因为 Composer 按顺序发请求,第一个返回 200 的就停)
- 只放第一位但没禁用 packagist:一旦私有源对某个包返回 404,Composer 立刻切去官方源,看起来像“白名单失效”
私有源必须能响应所有包的元数据请求
“白名单”行为成立的前提,是你的私有源(type: "composer")能稳定返回 packages.json,哪怕内容为空或只含部分包。如果它对 monolog/monolog 返回 500 或超时,Composer 就会中断并报错,而不是继续往下查下一个源。
- 验证方式:
curl -I https://pkg.example.com/packages.json必须返回 HTTP 200 - 内容至少得是合法 JSON:
{}或{"packages": {}}都可以;空响应或 HTML 页面会导致 Composer 解析失败 - VCS 类型(
type: "vcs")不参与此逻辑——它只在你require显式写明时才触发克隆,无法作为“白名单”兜底
怎么确认当前生效的优先级顺序
别信 composer.json 里的注释或记忆,运行命令看真实配置:
composer config repositories
输出中应该满足:第一项是你私有源的完整 URL(type: "composer"),最后一项是 {"packagist.org": false},中间不能出现 https://repo.packagist.org 或任何含 packagist 字样的对象。
- 如果看到
"type": "composer", "url": "https://repo.packagist.org"—— 说明没禁用成功,或写法错误(比如写成"packagist": false) - 如果私有源在第二位,而第一位是阿里云镜像 —— 那所有包都会先走镜像,私有包根本不会命中
- 改完后务必删掉
vendor/和composer.lock,再跑composer install,否则 lock 文件仍记录旧源地址
真正起作用的不是“白名单”,而是顺序+禁用+响应能力三者缺一不可。最容易被忽略的是:私有源的 packages.json 必须可访问且格式正确——它不像 Web 服务那样能“兜底返回 404”,而是要求每个请求都必须返回可解析的 JSON,哪怕空。











