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

Composer 离线安装包,本质不是“跳过网络”,而是把网络依赖提前下载好、带过去 —— 直接运行 composer install 不会成功,除非你已准备好完整且匹配的 vendor/ 或 composer.lock + 缓存包。
离线前必须在有网环境跑通 composer install --no-dev
这是最常被跳过的前提:离线机器上没 PHP、没 composer.phar、没 composer.lock,光拷贝 vendor/ 也没用。真正能离线部署的最小单元是:composer.lock + 已下载的包缓存(或完整 vendor/)+ 可执行的 composer。
- 务必在联网机器上用和目标环境一致的 PHP 版本、扩展(尤其是
openssl、zlib)执行composer install --no-dev --prefer-dist - 确认
composer.lock已提交到代码库,且未被 .gitignore 忽略 - 不要用
composer update生成 lock 文件 —— 它会改哈希、升版本,导致离线时校验失败
用 composer install --no-dev + vendor/ 整体拷贝最稳妥
比折腾缓存路径更可靠:直接把整个 vendor/ 目录打包带走。前提是两台机器架构、PHP 版本、扩展一致(尤其涉及 ext-gd、ext-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 里的哈希就对不上。










