离线安装依赖最简单有效的方式是直接复制 vendor 目录,但需确保源与目标环境的 PHP 版本、扩展、Composer 版本一致,且所有包为纯 PHP;否则易出现 Class not found 或 Extension missing 错误。

离线安装依赖前,先确认 vendor 目录是否可直接迁移
直接复制 vendor 是最简单有效的离线方案,但前提是目标环境与源环境的 PHP 版本、扩展(如 mbstring、openssl)、Composer 版本一致,且所有包都是纯 PHP(不含 post-install-cmd 编译逻辑)。否则会出现 Class not found 或 Extension missing 错误。
验证方式:在源环境运行
composer install --no-dev --optimize-autoloader,再检查
vendor/autoload.php 是否能被正常引入;目标环境用相同 PHP SAPI(CLI/FPM)执行同一段 require 测试。
- 若项目含
ext-redis等扩展依赖,目标机必须已安装对应扩展,否则composer install会跳过,但运行时崩溃 - 含
bin脚本的包(如phpunit)需确保目标机php在$PATH中,且路径一致 -
composer.lock必须一并拷贝,否则vendor中版本可能与 lock 不匹配
用 composer install --no-interaction --no-plugins 避免交互和插件干扰
即使有完整 vendor 和 composer.lock,在目标机执行 composer install 仍可能触发网络请求或插件行为(如 hirak/prestissimo、symfony/flex),导致失败或卡住。加参数可强制跳过这些环节:
composer install --no-interaction --no-plugins --no-scripts --no-dev --optimize-autoloader
关键参数说明:
-
--no-interaction:禁用任何用户输入提示(比如 license 确认) -
--no-plugins:不加载任何 Composer 插件(避免插件尝试联网或写文件) -
--no-scripts:跳过post-install-cmd等脚本(防止执行npm install或生成缓存) -
--no-dev:不安装require-dev包,减小体积并规避 dev-only 插件
打包 vendor 时注意 .gitignore 和 .gitattributes 的影响
直接 tar -czf vendor.tgz vendor/ 可能漏掉被 .gitignore 排除但实际需要的文件,比如某些包的 dist 构建产物或 resources 目录。更稳妥的方式是使用 rsync 保留全部内容:
rsync -a --exclude='*.git' --exclude='*.log' vendor/ vendor-dist/
然后压缩 vendor-dist/。特别注意以下三类易被忽略的文件:
-
vendor/bin/下的可执行脚本(如phpunit、phinx),权限需保留(rsync -a自动处理) -
vendor/composer/installed.json和autoload_*.php,是自动加载核心,不可缺失 - 某些包(如
laravel/framework)会在vendor/外写缓存(如bootstrap/cache/packages.php),这类不属于 vendor,不能靠打包解决
遇到 “Package x is not installed” 错误时的排查重点
该错误通常不是因为包没下载,而是 autoloader 没注册或路径错位。优先检查:
- 目标机
vendor/autoload.php是否存在且可读(file_exists()+is_readable()) -
composer.json中的autoload配置是否含相对路径(如"files": ["src/helpers.php"]),这些路径在离线迁移后可能失效 - 是否用了 classmap 扫描(
"classmap": ["src/"]),而vendor/composer/autoload_classmap.php没更新(此时需在源机运行composer dump-autoload --optimize再打包) - PHP OPcache 是否缓存了旧的 autoloader,可临时加
opcache_reset()或重启 PHP 进程
离线部署真正难的不是打包,而是环境一致性——PHP 小版本差一个 patch、某个扩展启用了不同编译选项,都可能导致 autoload 失败。建议把 php -v、php -m、composer --version 的输出做成校验清单,每次部署前比对。










