断网时composer install必须设COMPOSER_DISABLE_NETWORK=1,否则默认联网校验元数据会报Could not fetch错误;需配合--no-plugins --no-scripts --no-autoloader及后续dump-autoload -o,且PHP版本、扩展、lock中无source条目须完全匹配。

断网状态下没有“安装速度”可优化,只有“能否成功执行”这一前提——所有依赖必须提前准备好,且环境完全匹配,否则composer install会直接报错退出,根本不会进入下载或解压阶段。
为什么断网时composer install会卡住或报错
Composer默认行为是联网校验composer.lock中每个包的元数据(比如是否存在、版本是否合法),哪怕vendor/目录完整、composer.lock未改动,它仍会尝试请求https://repo.packagist.org/packages.json。这个请求无法跳过,也不能靠“断网自动降级”。
- 常见错误信息:
Could not fetch https://repo.packagist.org/packages.json - 即使设置了
--no-plugins、--no-scripts等参数,只要没设COMPOSER_DISABLE_NETWORK=1,这些参数全部被忽略 - 某些插件(如
hirak/prestissimo)或脚本(如post-install-cmd)会在install过程中隐式触发HTTP请求,必须显式禁用
COMPOSER_DISABLE_NETWORK=1是离线执行的硬开关
这不是建议项,而是强制前提。不设它,一切离线操作都无效;设了它,Composer才会跳过所有远程元数据请求。
- 在Dockerfile中:用
ENV COMPOSER_DISABLE_NETWORK=1 - 在shell中运行前:加前缀
COMPOSER_DISABLE_NETWORK=1 composer install - 注意:
--offline参数不存在,是常见误传,不要用 - 如果项目
composer.json里写了"repositories": [{"type": "packagist", "url": false}],即使设了该环境变量也会直接退出
离线安装必须配套的三步命令组合
仅靠COMPOSER_DISABLE_NETWORK=1还不够,必须配合参数组合与后续重建,否则运行时大概率Class not found。
-
composer install --no-plugins --no-scripts --no-autoloader:跳过插件初始化、脚本执行、autoload重建三个高风险环节 - 执行完必须立刻补一记:
composer dump-autoload -o,否则vendor/autoload.php不会更新,类加载失败 - 如果目标机PHP版本或扩展(
mbstring、openssl、zlib)不一致,require 'vendor/autoload.php'会直接失败,这个错误不会在install阶段暴露
vendor目录能复制,但有三个不可妥协的前提
最省事的方式是把整个vendor/连同composer.lock一起拷过去,但以下三点必须全部满足:
- 源与目标的PHP版本完全一致(包括小版本,如
8.3.12vs8.3.13可能因内部API变更导致Class not found) - 目标机已启用
mbstring、openssl、zlib扩展(缺一个,autoload.php就加载失败) -
composer.lock不含"source"类型条目(如"url": "git@github.com:xxx/yyy.git"或"dev-master"),否则离线无法校验
验证方式很简单:在目标机执行php -r "require 'vendor/autoload.php';",不报错才算真正通过。


















