离线环境下 composer install 报错的根本原因是默认访问 Packagist 校验元数据,而非单纯无网络;必须提前准备 composer.lock、本地包归档文件及无在线源的 composer.json 才能真正离线安装。

离线环境下 composer install 为什么总报错
根本原因不是“没网”,而是 Composer 默认行为会访问 Packagist(https://packagist.org)校验包元数据、检查更新、甚至下载 zip 包。哪怕你本地 vendor/ 已存在,只要没生成或没更新 composer.lock,它仍会尝试联网。常见错误如:Could not fetch https://packagist.org/packages.json、Failed to decode response: file_get_contents(): SSL operation failed(其实是 DNS 或连接超时伪装成 SSL 错误)。
离线安装必须提前准备的三样东西
缺一不可,否则无法跳过网络请求:
-
composer.lock文件必须存在且完整——它是离线安装的唯一依据,记录了每个包的确切版本、dist URL、SHA256 校验值 - 所有依赖包的 zip/tar 归档文件需提前下载好,并放在本地镜像目录(例如
./packages/)中,文件名必须与composer.lock中dist.zipball字段一致 - 项目根目录下要有
composer.json,且其中不能含repositories字段指向在线源(否则 Composer 仍会尝试访问)
验证方式:运行 composer install --no-interaction --no-progress --verbose,看到输出里出现 Installing monolog/monolog (2.10.0): Loading from cache 才算真正走离线路径。
用 archive mirror 实现可靠离线安装
最稳的方式不是靠 composer install --offline(该 flag 仅跳过部分检查,不保证完全离线),而是构建本地归档镜像。步骤如下:
- 在线环境执行:
composer archive monolog/monolog 2.10.0 --format=zip --dir=./packages/,对每个 require 的包逐个打包 - 把整个
./packages/目录拷贝到离线机器,和项目放同级 - 在
composer.json中添加本地仓库配置:{ "repositories": [{ "type": "package", "package": { "name": "monolog/monolog", "version": "2.10.0", "dist": { "url": "./packages/monolog-monolog-2.10.0.zip", "type": "zip" } } }] } - 删掉
vendor/和composer.lock,再运行composer install——此时所有包都从本地读取,不发任何 HTTP 请求
团队标准化离线环境的关键陷阱
最容易被忽略的是 PHP 扩展依赖检查。比如 ext-gd 或 ext-curl 在离线机上缺失,composer install 会直接失败,但错误信息只显示 Your requirements could not be resolved,不会明说缺扩展。务必在离线前确认:
- 目标机器
php -m输出包含项目所需全部扩展(特别是json、mbstring、openssl) -
composer.json中require字段下的php版本约束(如"php": "^8.1")必须与离线机实际版本严格匹配,小版本不一致也会触发解析失败 - 不要用
composer update生成composer.lock,必须用composer install——因为只有后者才会把 dist URL 和校验值写进 lock 文件
真正的难点不在“怎么配”,而在确保在线打包机和离线部署机的 PHP 环境、扩展列表、架构(x86_64/arm64)完全一致;差一个扩展或一个 ABI 兼容性问题,vendor/ 里的二进制扩展就会加载失败,而这个错误通常要等 autoload.php 被引入后才暴露。











