离线执行 composer update 的关键是提前在有网环境构建完整本地镜像并配置本地仓库。需用 composer config --global repositories 指向含 packages.json 和 dist 目录的标准本地镜像,且必须包含所有依赖的元数据与校验哈希,否则因校验失败中断。

如何让 composer update 在完全断网环境下执行
不能联网时,composer update 默认会直接失败——它要连 packagist.org、验证签名、拉取元数据。想让它跑起来,核心不是“绕过网络”,而是提前把所有依赖的元信息和包文件都本地化。
必须提前配置 composer config --global repositories 指向本地镜像
断网后,Composer 仍会尝试访问远程仓库地址。即使你有本地 zip 包,没告诉 Composer “别找网上,就用这个目录”,它照样报 Could not fetch https://repo.packagist.org/packages.json。
- 在有网时,用
composer config --global repositories.0.type composer - 同时设
composer config --global repositories.0.url /path/to/your/local-mirror(该路径下需含完整packages.json和dist/目录结构) - 本地镜像不能只是 zip 包堆在一起——必须是通过
composer archive或packagist-mirror工具生成的标准结构 - 若用
path类型仓库,只适用于开发态单个包,不支撑全量update场景
composer install 和 composer update 在离线时的根本区别
composer install 只读 composer.lock,只要所有 dist 文件已存在(比如提前 composer install --prefer-dist --no-interaction 并打包了 vendor/),它就能纯离线运行;但 composer update 必须重新解析依赖图,这就绕不开仓库元数据。
- 真正离线做
update,等价于“本地有一套可替代 packagist 的完整元数据服务” - 常见错误:把 vendor 打包带走,以为能直接
update—— 不行,缺packages.json和哈希校验信息 - 如果只是升级一个已知版本的包,可用
composer require vendor/name:1.2.3 --no-update && composer update vendor/name,但前提是该版本已在本地镜像中存在 - PHP 版本或平台配置变更时,
update还会触发platform-check,需确保composer.json中config.platform与目标环境一致,否则仍可能因环境不匹配中断
最简可行的离线 composer update 流程
没有魔法,只有两步:准备 + 替换。所谓“离线运行”,其实是把联网动作提前做完,再把结果整体搬过去。
- 在有网机器上,用相同 PHP 版本和 Composer 版本,执行
composer update --prefer-dist --no-interaction - 同步整个
vendor/目录 + 生成的composer.lock+ (关键)~/.composer/cache/下对应 hash 的 dist 文件(或直接打包 cache) - 目标机器上,先清空原有
vendor/和composer.lock,再还原上述三样东西 - 最后执行
composer install --no-scripts --no-plugins(跳过可能触发网络的脚本),它会严格按 lock 文件重建,不查网络
真正麻烦的从来不是命令怎么敲,而是元数据和 dist 文件的完整性校验——少一个 sha256,Composer 就会拒绝安装,且错误提示里根本不会说“你缺的是哪个文件”。










