不能直接复用其他项目的 vendor 目录,因 autoload 规则、minimum-stability、插件状态及 post-autoload-dump 脚本(含绝对路径)差异会导致类找不到、插件未加载或自动加载错乱;应复用 composer 缓存并配合 --prefer-dist --no-scripts 安装。

不能直接复用其他项目的 vendor 目录,但可以安全复用已下载的包缓存 —— 关键在 composer install --no-install 不行,得靠 composer install --prefer-dist --no-scripts 配合本地仓库配置。
为什么不能直接拷贝 vendor 目录?
不同项目 composer.json 的 autoload 规则、minimum-stability、插件启用状态都可能不同;直接挪用会导致 Class not found、Plugin not loaded 或自动加载错乱。更麻烦的是:某些包(如 laravel/framework)的 post-autoload-dump 脚本会写入绝对路径或生成环境相关文件,一复制就失效。
离线复用的正确路径:用 composer 自带的 cache + 本地 dist 包
Composer 默认把所有 .zip 或 .tar.gz 包存在 ~/.composer/cache/files/(Linux/macOS)或 %APPDATA%\Composer\Cache\files\(Windows)。只要目标服务器有相同架构(x86_64/arm64)、PHP 版本兼容、且这些包没被删过,就能跳过下载。
- 在联网机器上跑一次
composer install,确保 cache 已填充 - 打包整个
~/.composer/cache/目录,传到离线服务器对应位置 - 确认离线机上的
COMPOSER_CACHE_DIR环境变量指向该目录,或修改~/.composer/config.json中的cache-dir - 运行
composer install --prefer-dist --no-scripts --no-plugins(禁用脚本和插件可避免因缺失依赖报错)
如果连 cache 都没有,只能靠 packagist.org 镜像 + 本地 repo
这不是“复用 vendor”,而是模拟 Packagist 的最小可用服务。适合长期离线运维场景:
- 用
composer archive把每个包打成.zip,放在离线 HTTP 服务下(如 Nginx 的/packages/) - 在
composer.json里加自定义仓库:{"type": "composer", "url": "http://192.168.10.10/packages/"} - 必须提前生成
packages.json(可用composer dump-autoload+ 手动整理,或用packagist-mirror工具) - 注意:不支持
dev-master这类分支引用,只认dist归档,所以所有依赖得锁定具体版本号
最常被忽略的一点:离线机的 openssl.cafile 和 curl.cainfo PHP 配置若为空,即使走本地 repo,composer install 仍可能因 SSL 验证失败卡住 —— 得手动配好 CA 证书路径,或者临时设 export COMPOSER_DISABLE_TLS=1(仅限内网可信环境)。










