composer怎么在离线服务器上重建vendor?

1次阅读

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

composer怎么在离线服务器上重建vendor?

离线服务器上 vendor 目录缺失或损坏,怎么恢复?

直接结论:不能在离线机器上运行 composer installcomposer 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.phpvendor/composer/autoload_classmap.php

容易被忽略的坑:composer.lock 的哈希与平台差异

composer.lock 里记录了每个包的 dist.shasum,离线机解压后若手动改过 vendor/ 文件(比如 patch)、或用了不同压缩工具导致文件权限/时间戳变化,后续再执行任何 composer 命令都可能报 Hash mismatch

  • 解压时用 tar -xzf,不要用图形界面解压工具(它们常改权限)
  • 确认离线机 PHP 版本 ≥ composer.lockplatform.php 字段值,否则某些包(如 symfony/polyfill)的自动选择逻辑会出错
  • 如果项目用了 path 类型 repository(指向本地目录),离线机必须保证该路径存在且内容一致,否则 composer install 即使加了 --no-scripts 也会尝试读取它

最稳的方式,就是把整个 vendor/ 当作二进制产物对待——它不该在离线机上重建,只该被原样部署。任何试图“在离线机上重走一遍 composer 流程”的想法,都会掉进网络、权限、哈希、扩展缺失的连环坑里。

text=ZqhQzanResources