离线环境执行 composer install 报错“Could not fetch packages”是因为默认需联网获取包元数据和 ZIP 文件;解决方法是在有网机器运行 composer install --no-dev --prefer-dist --no-progress 生成完整 vendor/,连同 composer.json 和 composer.lock 拷贝至离线机,并设置 COMPOSER_DISABLE_NETWORK=1 执行安装。

composer install 为什么在离线环境报错 Could not fetch packages
因为默认行为是联网向 Packagist(或配置的仓库)实时拉取包元数据和 ZIP 文件。离线时 DNS 解析失败、HTTP 超时或直接无网络,composer install 就会卡在 Fetching packages 或直接抛出这个错误——它甚至不会尝试读本地缓存,除非你提前告诉它“别上网”。
用 composer install --no-install + composer dump-autoload 不行
这两个命令根本不解决依赖下载问题:--no-install 是跳过安装依赖(即不解压 vendor),dump-autoload 只刷新自动加载映射。它们对“如何把 vendor/ 带到离线机”毫无帮助。
真正要做的,是在有网机器上完整生成可搬运的依赖快照:
- 确保
composer.lock已提交且版本一致(离线机必须用同一份 lock 文件) - 运行
composer install --no-dev --prefer-dist --no-progress,让所有包以 ZIP 形式下载并解压 - 打包整个
vendor/目录(不是node_modules那种忽略规则,这里要全量) - 连同
composer.json和composer.lock一起拷到离线机
离线机上执行 composer install 仍报错?检查这三件事
常见错误不是命令写错,而是环境没对齐:
-
php版本必须 ≥composer.json中config.platform.php或各包require.php声明的最低版本(比如锁文件里某包 require php >=8.1,而离线机只有 8.0,就会失败) - 扩展缺失:如
ext-zip(解压 dist 包必需)、ext-json、ext-curl(即使离线,某些插件或脚本仍会调用 curl_init) - 权限问题:
vendor/解压后文件属主/权限被改过,导致 autoload 加载失败,错误可能表现为Class not found而非网络相关提示
想彻底禁用网络请求?设置 COMPOSER_DISABLE_NETWORK=1
这不是可选项,是离线操作的安全兜底。加了这个环境变量后,Composer 会在任何可能触发 HTTP 请求的地方直接报错退出,比如访问 repo 元数据、校验签名、甚至更新 lock 文件——强制你只能走已有的 vendor/ 和 lock。
执行时这样写:
COMPOSER_DISABLE_NETWORK=1 composer install --no-dev
注意:这个变量对 composer dump-autoload 或 composer run-script 无影响,只拦网络动作;但它会让 composer update 直接失败,所以离线环境严禁运行 update。
最易被忽略的一点:vendor/ 里有些包自带 post-install-cmd 脚本,例如 Laravel 的 @php artisan package:discover,它们可能隐式触发网络请求(比如查 license、上报 usage)。这类脚本得手动注释掉或用 --no-scripts 跳过。










