composer离线安装失败是因为默认联网解析lock文件、校验哈希、触发插件及脚本;即使vendor存在,断网仍会卡在downloading或报connection refused。

composer install 为什么离线会失败
因为 composer install 默认会联网解析 composer.lock 中的包地址、校验哈希、触发插件(如 hirak/prestissimo)、执行 post-install-cmd 脚本,哪怕 vendor/ 已存在,它仍可能尝试访问 Packagist 或 GitHub。一旦断网,就会卡在 Downloading... 或报 Connection refused。
直接复制 vendor 目录行不行
可以,但有硬性前提:
-
vendor/必须和目标机的 PHP 版本完全一致(如 8.2.12 vs 8.2.13 可能因内部 API 微变导致Class not found) - 所有扩展必须已启用:目标机需提前装好
mbstring、openssl、curl等,否则autoload.php加载失败 -
composer.lock必须一并拷贝,且不能被修改;否则composer install会尝试重算依赖 - 含
bin/脚本的包(如phpunit)要求目标机php在$PATH中,且路径与源环境一致
用 --no-plugins --no-scripts 强制跳过联网环节
即使有完整 vendor/ 和 composer.lock,不加参数仍可能触发插件或脚本导致失败。推荐在目标机运行:
composer install --no-interaction --no-plugins --no-scripts --no-dev --optimize-autoloader
关键点:
-
--no-plugins:禁用所有插件(包括自动加速下载的prestissimo) -
--no-scripts:跳过post-install-cmd,防止执行npm install或生成前端资源 -
--optimize-autoloader:强制重建vendor/autoload.php,避免残留旧路径 - 不要用
--ignore-platform-reqs——它会掩盖扩展缺失问题,让错误延后到运行时才暴露
预下载依赖包并打包成离线 tarball
最稳妥的离线方式是把所有 .zip/.tar.gz 包提前下全,再传到目标机。操作分两步:
- 在联网机执行:
composer install --no-install --prefer-dist,这会让 Composer 把所有包缓存到~/.composer/cache/files/ - 用
composer archive或手动打包:tar -czf deps.tgz ~/.composer/cache/files/ - 目标机上先清空缓存:
composer clear-cache,再解压到相同路径:tar -xzf deps.tgz -C ~ - 最后运行
composer install --no-interaction,Composer 就会从本地缓存读取,不再联网
注意:~/.composer/cache/files/ 下的目录结构是 vendor/name/version-hash/,文件名含哈希,不可手动改名;且该方式对含 git 仓库源的包无效(需改用 --prefer-dist 强制走 zip)。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











