离线服务器上 vendor 目录缺失或损坏时,必须在有网环境执行 composer install –no-dev –prefer-dist –no-interaction –no-plugins –no-scripts 生成完整 vendor/ 并压缩传输,离线机解压后按需运行 composer dump-autoload –optimize。

离线服务器上 vendor 目录缺失或损坏,怎么恢复?
直接结论:不能在离线机器上运行 composer install 或 composer update —— 它们默认要连 packagist.org。必须提前在有网环境把依赖「打包好」,再同步过去。
为什么 composer install 在离线机上会失败?
因为 composer install 会读 composer.lock,但仍然需要访问远程仓库(比如 packagist.org)去校验包元数据、下载 zip/tar 包,甚至触发 scripts 中的网络操作。只要没配本地镜像或离线源,它就会卡在 Downloading https://repo.packagist.org/packages.json 或报 curl Error 7: Failed to connect。
正确做法:用 composer install --no-interaction --no-plugins --no-scripts + 提前缓存
关键不是「怎么让离线机联网」,而是「怎么让它完全不联网也能装」。核心动作分两步:有网机打包、离线机解包。
- 在有网且环境一致(PHP 版本、扩展、OS 架构)的机器上,先确保
composer.lock已存在,然后运行:composer install --no-dev --prefer-dist --no-interaction --no-plugins --no-scripts - 执行完后,
vendor/就是完整可用的。把它整体压缩(如tar -czf vendor.tgz vendor/),传到离线机 - 离线机上清空旧
vendor/,解压覆盖:tar -xzf vendor.tgz - 如果项目含
autoload类型为classmap或用了files,别忘了再跑一次composer dump-autoload --optimize(这步不联网,只生成vendor/autoload.php和vendor/composer/autoload_classmap.php)
容易被忽略的坑:composer.lock 的哈希与平台差异
composer.lock 里记录了每个包的 dist.shasum,离线机解压后若手动改过 vendor/ 文件(比如 patch)、或用了不同压缩工具导致文件权限/时间戳变化,后续再执行任何 composer 命令都可能报 Hash mismatch。
- 解压时用
tar -xzf,不要用图形界面解压工具(它们常改权限) - 确认离线机 PHP 版本 ≥
composer.lock中platform.php字段值,否则某些包(如symfony/polyfill)的自动选择逻辑会出错 - 如果项目用了
path类型 repository(指向本地目录),离线机必须保证该路径存在且内容一致,否则composer install即使加了--no-scripts也会尝试读取它
最稳的方式,就是把整个 vendor/ 当作二进制产物对待——它不该在离线机上重建,只该被原样部署。任何试图“在离线机上重走一遍 composer 流程”的想法,都会掉进网络、权限、哈希、扩展缺失的连环坑里。