Composer断网安装报错本质是网络不可用,并非离线模式失效;真正可靠方式是设COMPOSER_DISABLE_NETWORK=1,强制跳过所有HTTP请求,仅依赖本地vendor/和composer.lock,但前提是二者必须完整且匹配。

Composer断网安装报错本质是网络不可用,不是“离线模式”失效
Composer 没有真正的离线安装机制。所谓“断网还能装”,前提是所有依赖包的 ZIP 文件、元数据(packages.json)和 composer.lock 中记录的校验信息,**本地缓存里全都有**。一旦缺一个 ZIP 或 provider 列表过期,它就会卡在 Loading composer repositories 或直接报 file could not be downloaded——这不是 bug,是设计如此。
- 运行
composer install -vvv看第一行真实请求 URL:如果出现https://packagist.org/或镜像域名但连接失败,说明缓存不全,强行断网必报错 -
composer.lock里硬编码了每个包的 dist URL 和 sha256,哪怕只改了一行 require,composer install就会尝试拉新地址——断网即失败 - 清过缓存(
composer clear-cache)后又联网跑过一次install,再断网重试才可能成功;否则vendor/里没东西,缓存里也没 ZIP,纯属空转
真正能断网安装的唯一可靠方式:COMPOSER_DISABLE_NETWORK=1
这个环境变量会强制跳过所有 HTTP 请求,只读本地 composer.lock 和 vendor/,不查镜像、不验签名、不下载 ZIP。但它有严格前提:
-
vendor/必须已存在且完整(含所有依赖及其autoload.php) -
composer.lock必须与当前composer.json完全匹配(运行composer update --lock可对齐) - 不能带
--no-install或--dry-run,否则它连 vendor 都不碰 - Linux/macOS 执行:
COMPOSER_DISABLE_NETWORK=1 composer install;Windows CMD:set COMPOSER_DISABLE_NETWORK=1 && composer install
为什么 --no-cache、--ignore-platform-reqs 这些参数断网无效
这些开关只影响行为逻辑,不绕过网络层。比如:
-
--no-cache是禁用本地缓存,但 Composer 仍会尝试发起 HTTP 请求去远程拉取——断网就立刻Connection refused -
--ignore-platform-reqs只跳过 PHP 版本、扩展检查,跟网络完全无关 -
--prefer-dist是指定下载 ZIP 而非 git clone,但 ZIP 地址仍是远程的,断网照样失败 - 就连
composer dump-autoload在某些插件场景下也会触发网络请求(如加载未声明的类映射),不一定安全
断网前必须做的三件事(漏一不可)
想确保下次断网能装,不是配个参数就行,得提前把“离线资产”备齐:
- 确认
composer.lock已提交进 Git,且内容与线上部署环境一致(尤其注意platform字段是否锁死 PHP 版本) - 手动验证缓存完整性:
ls -la $(composer config cache-dir)/files/ | wc -l应大于 0;再挑几个包名,比如monolog/monolog,看对应 ZIP 是否存在且能解压 - 删掉
vendor/后执行一次完整联网安装:composer install --no-dev --optimize-autoloader,成功后再断网测试——这才是真实离线路径
COMPOSER_DISABLE_NETWORK=1 也会在解压时报错,而你根本收不到网络层提示。所以“能断网”不等于“稳断网”,关键在缓存是否干净、lock 是否可信。


















