composer怎么离线安装包_composer离线部署依赖包方法

1次阅读

composer离线安装本质是预下载依赖,需在联网环境用目标php版本执行composer install –no-dev生成composer.lock和vendor/或缓存,再整体迁移;必须确保php、扩展、架构、composer版本一致,否则哈希校验失败。

composer怎么离线安装包_composer离线部署依赖包方法

Composer 离线安装包,本质不是“跳过网络”,而是把网络依赖提前下载好、带过去 —— 直接运行 composer install 不会成功,除非你已准备好完整且匹配的 vendor/composer.lock + 缓存包。

离线前必须在有网环境跑通 composer install --no-dev

这是最常被跳过的前提:离线机器上没 PHP、没 composer.phar、没 composer.lock,光拷贝 vendor/ 也没用。真正能离线部署的最小单元是:composer.lock + 已下载的包缓存(或完整 vendor/)+ 可执行的 composer

  • 务必在联网机器上用和目标环境一致的 PHP 版本、扩展(尤其是 opensslzlib)执行 composer install --no-dev --prefer-dist
  • 确认 composer.lock 已提交到代码库,且未被 .gitignore 忽略
  • 不要用 composer update 生成 lock 文件 —— 它会改哈希、升版本,导致离线时校验失败

composer install --no-dev + vendor/ 整体拷贝最稳妥

比折腾缓存路径更可靠:直接把整个 vendor/ 目录打包带走。前提是两台机器架构、PHP 版本、扩展一致(尤其涉及 ext-gdext-mbstring 等 C 扩展的包)。

  • 执行完 composer install --no-dev 后,检查 vendor/autoload.php 是否可 require,避免漏掉 autoload 配置错误的包
  • 若项目含 bin/ 脚本或需要 post-install-cmd,这些钩子不会在离线机器自动触发 —— 得手动补(比如 php artisan optimize:clear
  • windows 打包传到 linux 时注意换行符和权限:chmod -R 755 vendor/ 可能必要

想复用缓存?得导出 ~/.composer/cache/ 并对齐路径

Composer 默认把 zip 包、dist 文件存在用户目录缓存里,但离线机器没有这个路径,或路径不一致就会重新联网 —— 它不会报错,而是静默 fallback 到远程源。

  • 在联网机执行 composer config --global cache-dir /path/to/shared/cache,再装一次包,让所有 dist 下载到指定目录
  • 把该目录整体拷贝到离线机,并在离线机运行 composer config --global cache-dir /path/to/shared/cache
  • 验证是否生效:运行 composer install --no-dev -vvv,看日志里是否出现 Downloading https://... -> using cache

常见失败现象和对应检查点

离线失败往往不报 “网络错误”,而是卡在奇怪位置,比如 Package operations: 0 installs, 0 updates, 0 removals 却没生成 vendor/,或提示 class not found

  • Could not find package xxx at version yyy:lock 文件里的 version/constraint 和本地缓存/包不匹配,删掉 vendor/composer.lock 重来(别只删 vendor)
  • Failed to decode zlib stream:zip 包损坏,通常是传输过程没用二进制模式,或解压工具不兼容 —— 改用 tar -zcf 打包
  • 装完后 autoload.php 报错 require(): Failed opening required 'vendor/composer/autoload_real.php':说明 vendor/composer/ 目录缺失或权限不对,检查是否漏拷了隐藏文件

真正麻烦的从来不是“怎么拷”,而是“哪几层环境要一模一样”:PHP 小版本、OpenSSL 版本、zlib 支持、甚至 Composer 自身版本(composer --version)。差一点,composer.lock 里的哈希就对不上。

text=ZqhQzanResources