composer install 不能直接从本地 tar/zip 恢复,因它只依据 composer.lock 中记录的 exact version、hash 和 source type(dist 或 source)执行下载或克隆,完全忽略手动放置的压缩包;真正可恢复的路径是:确保 composer.lock 完整且与备份 vendor/ 目录严格匹配,删掉现有 vendor 后运行 composer install --no-scripts --no-plugins 验证一致性。

为什么 composer install 不能直接从本地 tar 包或 zip 备份恢复依赖
它根本不认压缩包——composer install 只读 composer.lock,然后按里面记录的 exact version、hash 和 source type(如 dist 或 source)去下载或克隆。你扔个 vendor-backup.tar.gz 给它,它完全无视。
真正能“从备份恢复”的路径只有一条:确保 composer.lock 完整,再让 Composer 信任本地已有文件,跳过网络拉取。
- 备份必须包含完整的
vendor/目录 + 对应的composer.lock(二者版本必须严格匹配) - 运行前删掉现有
vendor/(避免混杂) - 用
composer install --no-scripts --no-plugins启动,防止脚本干扰还原过程
如何让 composer install 复用已有的 vendor 文件(不重下)
Composer 默认行为是“删 vendor → 重装”,但你可以骗它:把备份解压到 vendor/ 后,用 --ignore-platform-reqs 和 --no-install 不行——这些参数不管用。真正起效的是:先解压,再用 composer install 验证一致性。
- 把备份解压到项目根目录,确保路径是
./vendor/(不是./backup/vendor/) - 确认
composer.lock文件存在且未被修改(git status或sha256sum composer.lock对比备份时的哈希) - 执行
composer install --dry-run:它会检查vendor/是否与lock完全一致,输出 “Nothing to install, update or remove” 就说明成功复用 - 如果报错
Package x is not installed,大概率是某个包的composer.json或installed.json缺失——别手修,直接删 vendor 重来
composer install 从私有 Git 仓库恢复时的常见断点
如果你的 composer.lock 里有 "source": {"type": "git", "url": "git@xxx", ...} 这类记录,而备份里只有 dist 归档(比如 zip),composer install 仍会尝试走 git clone——哪怕 vendor 已存在。这会导致权限失败或超时中断。
- 检查
composer.lock中每个包的dist字段是否完整(含url、shasum),这是跳过 git 的关键 - 若只有
source没dist,说明当初 install 时用了--prefer-source,这种备份无法离线还原,必须联网或换用 dist 模式重备 - 临时禁用 git 协议:在
composer.json加"preferred-install": {"*": "dist"},再跑composer install
备份和恢复必须同步的三个隐性状态
很多人恢复失败,不是因为 vendor 或 lock 缺失,而是忽略了这三个 Composer 不明说但强依赖的状态:
-
vendor/composer/installed.json:它由 Composer 自动生成,记录每个包的安装路径、版本、源类型。删了 vendor 后手动复制旧版进去,composer install会把它当“已安装”跳过,但 hash 校验可能失败 - PHP 扩展兼容性:比如备份是在 PHP 8.1 下做的,当前环境是 8.3,某些扩展(如
ext-mongodb)版本不匹配,composer install会拒绝继续——加--ignore-platform-reqs可绕过,但运行时可能崩 - 平台配置差异:
COMPOSER_HOME、platform配置项(如"ext-gd": "8.1.0")若与当前环境冲突,install会停在平台检查阶段
最稳妥的做法:备份时用 composer archive 打包,而不是手动 tar vendor;恢复时优先走 CI 环境镜像或 composer install --no-dev 精简路径。手动恢复永远有隐性风险,尤其跨机器、跨 PHP 版本时。











