必须在项目级 composer.json 顶层写 "packagist": false,因全局配置 composer config --global repo.packagist false 会将该字段设为非法布尔值,导致后续命令报错“Invalid repository url "false"”,且无法自动恢复,需手动修复 config.json。

必须在项目级 composer.json 顶层写 "packagist": false,全局配置 composer config --global repo.packagist false 不仅无效,还会导致后续所有命令报错。
为什么 composer config --global repo.packagist false 会失败
这个命令把 repo.packagist 的值设成布尔 false,但 Composer v2+ 要求该字段是合法 URL(如 {"type": "composer", "url": "https://..."})。它不识别 false 为“关闭开关”,而是当成一个非法地址,后续执行 composer install 时直接报错:
Invalid repository url "false"
这不是配置没生效,是配置被破坏了。想恢复?得手动编辑 ~/.composer/config.json 删除或修正该字段。
"packagist": false 必须放在 composer.json 顶层
它不能塞进 repositories 数组里,也不能放在 config 块下,必须和 require、autoload 平级。否则 Composer 完全忽略。
正确写法示例:
{
"name": "my/project",
"packagist": false,
"require": {
"monolog/monolog": "^2.0"
},
"repositories": [
{
"type": "composer",
"url": "https://packages.mycompany.com/"
}
]
}
-
"packagist": false和"packagist.org": false效果等价,但前者更简洁、官方文档推荐 - 如果同时写了
"packagist": false和"packagist.org": false,后者会被忽略 - 一旦禁用,默认源连带其子域(如
packagist.com)全部失效,所有依赖(含嵌套依赖)都必须显式存在于repositories列表中
禁用后,私有源必须显式声明且顺序关键
Composer 不会自动 fallback 到你写的私有源——它只按 repositories 数组顺序逐个尝试。如果第一个源返回 404 或无匹配包,就报错,不会继续查第二个。
- 确保私有源 URL 是 HTTPS 且以
/结尾,否则请求packages.json时路径拼接错误(如变成/composerpackages.json) - 私有源类型必须明确写
"type": "composer",不能省略或写成vcs、package - 若同时需要阿里云镜像做元数据代理 + 私有源共存,应把私有源放
repositories数组首位,镜像次之,并确保两者都显式声明
最容易被忽略的点:禁用默认源不是“关掉一个开关”,而是彻底移除 Composer 的兜底行为。一旦 repositories 里漏了一个依赖所在源,或者私有源本身没同步某版本,composer update 就会卡在 “Could not find package…” —— 此时不是网络问题,是配置链断了。


















