优先执行composer install --dry-run;若显示大量Skipped则直接重试install即可续装,否则删vendor/autoload.php和vendor/composer/后dump-autoload再install。

Composer install 中断后 vendor 不完整,怎么安全续装?
直接删 vendor 重来不是最稳的方案,尤其在 CI 或受限环境里——中断往往意味着部分包已写入、autoload 已生成、但依赖链没走完,强行清空可能触发 autoload.php 错误或 Class not found。
优先执行 composer install --dry-run,看它是否报出“already installed”或“skipping”类提示。如果输出显示大部分包状态为 Skipped,说明 Composer 能识别已安装部分,此时直接再跑一次 composer install 就能续上。
若 --dry-run 报错(比如提示某个包的 autoload.php 缺失),说明中间态损坏较深,这时才需要清理:
- 删掉
vendor/autoload.php和vendor/composer/目录(保留vendor/下其他包目录) - 运行
composer dump-autoload重建自动加载映射 - 再执行
composer install
注意:不要只删 vendor/ 下某几个包目录,Composer 不会自动补全“半截包”,它只认 composer.lock 的完整快照。
依赖项已被发布者删除,composer install 卡在 Downloading 或 Extracting 怎么办?
这不是网络超时或权限问题,而是 Packagist 上该版本已被下架(如作者 abandoned 或手动 delist),Composer 仍试图从 dist URL 拉取 ZIP,但返回 404 或空响应。
验证方式很简单:复制错误信息里的包名和版本(如 monolog/monolog:1.25.0),访问 https://www.php.cn/link/157d6c765acb6d1b2d0f7d7f6c4ca16a,若页面显示 “This version does not exist” 或跳转到 404,即确认已被删。
此时不能靠 --no-cache 或换镜像解决,因为所有镜像都同步 Packagist 元数据,下架是全局行为。可行路径只有两条:
- 降级到该包仍有效的旧版本(查 Git 历史或团队文档,改
composer.lock里对应条目的version和dist.sha256,再composer install) - 升级到作者推荐的替代包(如
monolog/monolog→monolog/monologv2+,或按Package is abandoned提示换成php-monolog/monolog等)
别用 composer update monolog/monolog 直接升——它可能拉到不兼容的主版本,先 composer why-not monolog/monolog:^2.0 看阻塞链。
composer show --tree 突然不输出,或只显示一行
这不是命令坏了,而是环境快照缺失或错位。最常见三种情况:
-
composer.lock不存在或为空 →composer show --tree退化为只读composer.json,且仅展示顶层require,不展开任何传递依赖 -
vendor/目录为空或不匹配composer.lock→ 输出为空或报No composer.json found(实际是找不到已安装包元数据) - 当前不在项目根目录(即没有
composer.json的目录)→ 命令根本无法初始化,直接失败
验证方式很简单:运行 ls -l composer.json composer.lock vendor/,三者必须同时存在且内容有效。如果 vendor/ 是空的,先跑 composer install;如果 lock 缺失,别急着 update,先确认团队是否本就用“无 lock 提交”策略。
为什么删了 vendor 还是没重装?关键在 composer.lock
composer install 的语义就是“按 lock 文件还原”,哪怕 vendor/ 是空的,它也只照着 composer.lock 里的哈希和路径去解压缓存包——这不是重装,是复原。你改了 composer.json 里的版本号?它不看。换了 PHP 8.3?lock 里记的是旧平台解析结果,照样装。
常见错误现象:composer install 输出飞快、没看到 Downloading,文件时间戳没变,甚至校验失败(Invalid zip file)。真正触发全新依赖解析的唯一方式是删掉 composer.lock,再跑 composer install。
只删 vendor/ 不删 composer.lock → 仍是复原
只删 composer.lock 不清缓存 → 可能从 ~/.composer/cache/files/ 解压旧 zip,连网络请求都不发
彻底重装:删 vendor + 删 lock + 清缓存 + --no-cache
要确保每个包都从远程源真实拉取、校验、安装,必须切断三个来源:已安装产物、锁定依据、本地缓存。漏掉任意一层,都可能复用旧文件。


















