有composer.lock但vendor被删时,应直接运行composer install还原;若lock损坏或丢失,vendor完好则用composer update --lock重建锁文件,vendor也损坏则先删vendor再install。

误删 vendor 或 composer.lock 后,没有备份 ≠ 没法还原——关键看你还留着什么。 Composer 本身不存“元数据快照”,所谓“元数据备份”实际指 composer.lock、vendor/composer/installed.json、本地缓存目录这三类可恢复源。恢复路径完全取决于你手头还剩哪几样东西,而不是有没有“备份文件”。
有 composer.lock 但 vendor 被删:立刻用 install
这是最干净的情况。composer.lock 包含所有包的精确版本、哈希值和依赖树,只要它完好,composer install 就能 100% 还原原始 vendor/ 目录。
- 先确认当前目录下存在
composer.lock:ls -la composer.lock - 删掉损坏或不存在的
vendor/:rm -rf vendor - 运行
composer install(不要加--no-dev,除非你确定原环境也没装开发依赖) - 如果报错
Root composer.json requires xxx but it is not satisfied,说明composer.lock和composer.json不匹配,跳到下一节处理
composer.lock 损坏或丢失:别删锁重跑 install
composer install 没有 composer.lock 就直接失败,删了再跑只会报错或静默跳过。此时必须区分两种状态:
- 如果
vendor/还在且可用(比如php -m | grep mbstring能看到扩展,或composer dump-autoload不报错),就用composer update --lock—— 它只读取当前vendor/中已安装的包,原样写回composer.lock,不升级、不解析、不改依赖 - 如果
vendor/也损坏(如vendor/autoload.php不存在、Class not found报错),先rm -rf vendor,再运行composer install(前提是 lock 文件已修复或找回) - 如果
composer.lock和vendor/都不可信(比如 Git 合并冲突残留 rm composer.lock && rm -rf vendor && composer update
啥都没了?从 vendor/composer/installed.json 提取依赖
只要 vendor/ 目录还在(哪怕项目没 composer.json),就能抢救出绝大部分依赖信息。核心文件是 vendor/composer/installed.json,它记录了每个已安装包的 name、version、type、autoload 等字段。
- 检查是否存在:
ls -l vendor/composer/installed.json - 用
composer show --installed输出可读列表(比直接读 JSON 更稳) - 把输出粘贴进编辑器,用正则
([A-z0-9\/\-\.]+)\s+([A-z0-9\.\-]+)匹配包名和版本,替换为"$1":"$2",填进新composer.json的require段 - 注意区分
require-dev:带dev-前缀或明显是测试/分析工具(如phpunit/phpunit、phpstan/phpstan)的应归入该段 - 生成完
composer.json后,仍需运行composer update生成合法composer.lock
缓存干扰导致“还原失败”:清 repo 元数据,不是 clear-cache
你以为还原了镜像、删了 vendor、重跑了 install,结果还是拉不到新包?大概率是本地缓存的 packages.json 还在生效。这个文件默认 15 分钟不过期,且 composer clear-cache 不会动它。
- 查当前实际请求源:
composer require monolog/monolog --no-install -vvv 2>&1 | grep "GET ",看 URL 是不是https://repo.packagist.org - 强制刷新元数据(Composer ≥2.5):
composer update --refresh - 旧版(≤2.4)必须手动删:
rm -rf $(composer config --global cache-dir)/repo/https---packagist.org - 删完后顺手清掉
vendor/composer/installed.json和composer.lock,避免哈希校验失败
最容易被忽略的是:Git 里没提交 composer.lock,或 .gitignore 把它屏蔽了。这种情况下,新机器上 clone 下来天然就没 lock,composer install 必然失败——你得接受它本来就不该被当成“可恢复状态”,而应该把 composer update 当作初始化动作。元数据不在 Git 里,就不算真正落地。











