离线安装失败主因是COMPOSER_DISABLE_NETWORK=1未生效或项目级composer.json残留远程仓库配置;即使vendor和lock完整,Composer仍默认请求远程元数据校验,必须三者协同禁用网络(环境变量、全局config、项目配置)才能成功。

离线配置失败,90% 不是缓存或 vendor 残留问题,而是 COMPOSER_DISABLE_NETWORK=1 没生效,或项目级 composer.json 里残留了远程仓库配置。
为什么 vendor 存在、lock 文件完整,install 还是报 Could not fetch
Composer 默认行为是:即使 vendor/ 已满,composer install 仍会主动请求远程元数据(如校验包哈希、确认版本存在),这个步骤无法跳过——除非彻底切断所有联网路径。
-
COMPOSER_DISABLE_NETWORK=1是硬性前提,不设它,所有--no-xxx参数都无效 - 全局配置残留
repo.packagist会导致 fallback 校验,必须运行composer config --global repo.packagist false彻底禁用 -
composer.lock中若含"source": {"type": "git", "url": "https://..."}类条目,离线时无法校验,install 必然失败 - 项目
composer.json里写了"repositories": [{"type": "packagist", "url": false}],在COMPOSER_DISABLE_NETWORK=1下也会直接退出,不是静默忽略
离线命令组合为何总卡在 Loading composer repositories
这不是网络超时,是 Composer 在解析 repositories 数组时遇到非法项,直接静默跳过甚至中断流程——比如 type 拼错("compsoer")、URL 缺 .git 或末尾 /、type: "package" 在 Composer ≥2.2 已被移除。
- 运行
composer diagnose,它会明确指出哪一行 “failed to parse” -
type: "vcs"必须配 Git/SVN 地址,且 URL 末尾带.git(如https://gitlab.example.com/myorg/pkg.git) -
type: "composer"的 URL 必须可访问、返回 HTTP 200、响应体是合法 JSON 且含顶层packages键,路径末尾必须有/ - 多个
repositories条目中只要有一个type拼错,整个解析就会失败,不会继续往后看
加了私有源却 still Could not find package 怎么办
根本原因不是 URL 写错了,而是 Composer 默认关闭了 packagist.org 的隐式源——哪怕你只加了一条 vcs,它也不会再去查 Packagist,除非你显式兜底。
- 在项目级
composer.json的repositories数组里,补上这一条:{"type": "composer", "url": "https://packagist.org", "packagist": false}(注意不是删掉,是显式禁用) - 更稳妥的做法:把私有源放数组最前面,再加这条兜底项,确保路由可控
- 别依赖
composer config -g repositories;全局配置和项目级composer.json冲突时,后者完全屏蔽前者
真正容易被忽略的点是:离线环境里,composer install 的成败不取决于 vendor 是否存在,而取决于「是否让 Composer 完全相信它不需要联网」——这需要环境变量、全局配置、项目配置三者协同失效,缺一不可。


















