直接复制 vendor 目录不可靠,因 composer install 默认仍会联网校验元数据;必须设 COMPOSER_DISABLE_NETWORK=1 并加 --no-plugins --no-scripts --no-autoloader --no-dev 参数,再执行 composer dump-autoload -o 补全 autoload,且 PHP 版本、扩展等环境须完全一致。

直接复制 vendor 目录是最可靠、最轻量的离线方案,但必须满足环境一致性前提,否则 Class not found 或扩展缺失错误会立刻暴露。
为什么不能只拷 vendor 就完事
常见错误现象:composer install 在离线机上仍报 Could not fetch https://repo.packagist.org/packages.json,或运行时抛 Class not found —— 这不是 vendor 缺文件,而是 Composer 默认行为没被压制。
-
vendor/本身不含元数据校验逻辑,但composer install命令默认仍会尝试联网验证包存在性、版本合法性、dist.shasum匹配等 - 即使
vendor/已满,只要没设COMPOSER_DISABLE_NETWORK=1,它就一定会发起 HTTPS 请求 - 某些包(如
laravel/framework)的post-autoload-dump脚本写入了绝对路径,一复制就失效,需补composer dump-autoload -o -
composer.lock必须随vendor/一起迁移,否则composer install会尝试重新解析依赖树并失败
composer install 离线执行必须加的参数组合
这组参数不是“可选优化”,是防止意外联网的强制防护。前提是:源机已执行过完整安装,且 vendor/ 和 composer.lock 已打包同步到目标机。
-
COMPOSER_DISABLE_NETWORK=1:硬性禁用所有网络通路,不设它,其余参数全无效 -
--no-plugins:跳过插件初始化(如hirak/prestissimo、symfony/flex),避免插件隐式联网 -
--no-scripts:屏蔽post-install-cmd等脚本,防止调用 npm、生成前端资源或访问外部 API -
--no-autoloader:跳过 autoload.php 重建(因 vendor 已含可用 autoload),留待后续手动补全 -
--no-dev:不安装 require-dev 包,减小体积并规避 dev-only 插件干扰
执行命令示例:
COMPOSER_DISABLE_NETWORK=1 composer install --no-plugins --no-scripts --no-autoloader --no-dev
补全 autoload 是最后一步,也是最容易漏的一步
直接复制 vendor/ 后,vendor/autoload.php 中的路径可能残留 symlink 或旧缓存,导致类映射错乱;尤其当源机和目标机 vendor-dir 配置不同、或用了自定义 autoloading 规则时。
- 必须在目标机执行:
composer dump-autoload -o,强制重建权威类映射(classmap-authoritative) - 若项目用了 PSR-4 自动加载且目录结构有变动,
-o可避免文件扫描遗漏 - 验证方式:写一行测试代码
require 'vendor/autoload.php'; var_dump(class_exists('Monolog\Logger'));,输出bool(true)才算真正就绪
最关键的细节不在命令本身,而在环境一致性:PHP 小版本(如 8.2.12)、mbstring/openssl/zlib 扩展是否启用、Composer 版本是否 ≥ 源机版本 —— 这些不匹配,vendor/ 就只是个假象,跑两行代码就会崩。


















