能,但只清本地下载缓存,不解决依赖图残留——它会删除已下架包在~/.composer/cache/中的ZIP、dist及元数据,但不触碰composer.lock记录和vendor/目录;需配合composer install同步清理vendor、composer dump-autoload -o重建自动加载映射,并用composer depends核查隐式依赖。

composer clear-cache 能清掉已下架包的缓存吗
能,但只清本地下载缓存,不解决依赖图残留。已下架包(比如 packagist.org 上 404 的 oldvendor/oldpackage)的 ZIP、dist 文件、元数据快照都存在 ~/.composer/cache/ 下,composer clear-cache 会一并删掉这些文件,避免后续 composer install 错误地复用损坏或过期的缓存内容。
但它不会动 composer.lock 里的记录,也不会删 vendor/ 中可能已存在的旧目录——那些得靠其他步骤处理。
- 运行
composer clear-cache前先确认缓存路径:composer config --global cache-dir - 如果缓存目录被权限锁住(比如之前用
sudo composer install写入),普通用户执行clear-cache会静默失败,需加sudo或改权限 - Windows 用户注意:
%APPDATA%\Composer\Cache可能被杀毒软件锁定,临时禁用再清
composer show 报错 Package not found 但 vendor/ 还在
这是典型“声明已删、物理未清”状态。常见于:你手动删了 composer.json 里的行,但没跑 composer install;或 composer remove 执行中途被 Ctrl+C 中断;或用了 --no-update 参数。
composer show 查的是 composer.lock 和当前 vendor/ 的交集,报错说明 lock 文件里已无该包,但 vendor 目录没同步删——这本身不危险,但下次 composer update 可能因路径冲突失败。
- 安全清理方式:运行
composer install --no-dev(生产环境)或composer install(开发环境),它会按 lock 文件精确重建 vendor - 别用
rm -rf vendor/oldvendor手动删——若该包被其他包 require,重装时可能拉不回来,或 autoload 映射错乱 - 验证是否真清完:
ls vendor/oldvendor应返回No such file or directory
autoload_psr4.php 里还留着已下架包的命名空间
只要没运行 composer dump-autoload -o,旧的自动加载映射就一直留在 vendor/composer/autoload_psr4.php 里。哪怕包已下架、vendor 已空,PHP 仍可能从这个文件里找到路径,导致类看似“还能 new”,实则加载的是废弃代码或报 Class not found(因为文件物理不存在)。
尤其 Laravel 9+ 默认启用 classmap-authoritative,不执行这步必出问题。
- 必须补上:
composer dump-autoload -o,强制重建所有映射 - 手动检查:
grep -n "oldvendor" vendor/composer/autoload_*.php,确认无匹配结果 - 如果用了 OPcache,记得调
opcache_reset();APCu 用户跑apcu_clear_cache()
怎么确认一个已下架包没被其他依赖暗中 require
下架 ≠ 无人依赖。某个包即使从你的 composer.json 移除了,也可能被已安装的其他包(比如 symfony/console)在 require 字段里硬依赖。直接删会导致运行时报错。
别猜,用 Composer 自带命令查依赖链:
- 运行
composer depends oldvendor/oldpackage,若有输出,说明有包正依赖它,不能直接删 - 若返回空,再检查
composer.lock里是否还有该包的条目(搜索"oldvendor/oldpackage") - 最后 grep 项目代码:
grep -r "oldvendor" app/ config/ --include="*.php",重点看配置文件里的字符串类名、服务提供者注册、事件监听器等动态引用点
下架包最难搞的不是缓存,是那些藏在字符串里的引用——它们不会被 composer remove 触及,也不会被静态分析工具捕获,只能靠人工扫。











