必须显式禁用网络(如COMPOSER_DISABLE_NETWORK=1)并清除全局镜像、校验lock文件无源地址、确保PHP环境一致,否则composer install会因强制请求packages.json而失败。

不能靠“断网”自动触发离线安装,必须显式禁用网络通路,否则 composer install 一定会失败。
为什么直接断网后运行 composer install 还是报错
错误不是因为 vendor 缺文件,而是 Composer 默认会主动请求 https://repo.packagist.org/packages.json 做元数据校验——这个行为无法跳过,哪怕 vendor/ 和 composer.lock 都完整存在。你看到的 Could not fetch packages.json 或 Connection refused,本质是它在 Loading composer repositories 阶段就卡死了。
-
--offline参数根本不存在,是常见误传,加了也无效 - 只设
--no-plugins --no-scripts不够,没关网络开关,所有参数都会被忽略 - 全局镜像配置(如阿里云镜像)仍会 fallback 触发请求,必须提前清理
离线安装前必须做的三件事
缺一不可,否则命令执行到一半就会退出:
- 运行
composer config --global repo.packagist false彻底禁用 Packagist 全局源 - 确认
composer.lock中不含"source"类型条目(比如"url": "git@github.com:xxx/yyy.git"或"dev-master"),这类条目离线无法校验 - 确保目标机 PHP 版本、扩展(
mbstring、openssl、zlib)与打包环境完全一致,小版本差异也可能导致Class not found
真正能跑通的离线命令组合
这组参数不是“优化”,是防止任何意外联网的强制防护:
- 必须前置设置环境变量:
COMPOSER_DISABLE_NETWORK=1(Linux/macOS 直接写在命令前;Windows 用set COMPOSER_DISABLE_NETWORK=1或 PowerShell 的$env:COMPOSER_DISABLE_NETWORK="1") - 执行:
composer install --no-plugins --no-scripts --no-autoloader --no-interaction - 紧接着必须补一记:
composer dump-autoload -o,否则运行时大概率Class not found
完整示例(Linux/macOS):COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader --no-interaction && composer dump-autoload -o
别碰 composer require 和 create-project
这两个命令天生不支持离线:
-
composer require默认必须联网解析依赖树、校验版本、更新composer.lock,它不查~/.composer/cache/files/,也不复用本地 ZIP -
composer create-project第一步就强制请求远程元数据,COMPOSER_DISABLE_NETWORK=1对它完全无效 - 想加新包?只能回到有网机器:手动改
composer.json→composer update vendor/package --no-dev --prefer-dist --no-scripts --no-plugins→ 打包整个项目目录(含vendor/和composer.lock)→ 再拷到离线机
最容易被忽略的是:composer.lock 里一个 Git URL 就能让整套流程失败,而这种问题往往要等 install 执行到一半才暴露。











