能,但效果有限——它只清掉 Composer 全局缓存(如 cache/files/、cache/dist/ 等),通常几 GB,不清理项目 vendor/ 或临时文件,无法显著释放 C 盘空间。

composer clear-cache 能不能直接释放 C 盘空间?
能,但效果有限——它只清掉 ~/.composer/cache(Windows 是 %APPDATA%\Composer\cache),这部分通常占几 GB,对动辄几十 GB 的 vendor/ 来说只是“毛毛雨”。真正吃 C 盘的,往往是项目里反复 composer install 留下的旧 vendor/、没删干净的 node_modules/,或者 Composer 在 %TEMP% 或 C:\Users...\AppData\Local\Temp 解压 zip 时爆掉的临时文件。
-
composer clear-cache清的是全局缓存,不碰任何项目目录,安全 - 它默认会删掉
cache/files/(zip 包)、cache/dist/(解压后 dist)、cache/repo/(包索引快照)、cache/vcs/(git 克隆的裸仓库) - 如果你刚在 C 盘装了十几个 Laravel 项目,每个都带完整
vendor/,那清缓存根本救不了命,得动手砍vendor/
怎么精准清理旧版包缓存,而不是全盘清空?
Composer 没有 composer prune-cache --unused 这种命令。所谓“旧版”,是指你的所有项目当前 composer.lock 文件里完全没引用的包版本,比如缓存里存着 monolog/monolog/1.20.0.zip、1.25.0.zip、2.4.0.zip,但你所有项目 lock 文件里只写了 2.4.0,那前两个就是冗余。
- 先确认缓存位置:
composer config --global cache-dir - 进入
cache/files/,按包名分目录,每个子目录下是版本号.zip - 手动比对:打开一个项目的
composer.lock,搜"name": "monolog/monolog",看"version"字段值;再检查其他项目,汇总出所有“正在用”的版本 - 删除其余 zip 文件(别删整个包目录,只删不用的版本)
示例(Linux/macOS):find ~/.composer/cache/files -name "monolog-monolog-1.20.0.zip" -delete
注意:cache/vcs/ 下的 git 仓库可以整目录清:rm -rf ~/.composer/cache/vcs/*,下次需要时自动重建,很安全;但 cache/repo/packagist.org/ 别碰,删了首次 composer update 会卡很久。
为什么清完缓存,C 盘还是满?可能是 inodes 耗尽
尤其 Windows WSL 或 macOS 使用 APFS 时,composer clear-cache 后 df -h 显示磁盘还有 20GB,却报 disk quota exceeded 或 No space left on device——这大概率是 inodes(文件节点)满了。
- Composer 缓存含海量小文件(每个 zip、每个 JSON 元数据、每个 VCS 提交哈希都是独立 inode),
~/.composer/cache/vcs/尤其恐怖 - 查 inodes 使用率:
df -i,如果Use%接近 100%,哪怕空间剩得多也写不了新文件 -
composer clear-cache是最有效的 inodes 释放手段之一,因为它批量删掉成千上万个缓存小文件 - 若仍不够,就得查哪边在疯狂生成小文件:比如 CI 脚本反复
composer create-project却不清理、或用了hirak/prestissimo插件导致临时文件残留
Windows 用户特别注意:C 盘缓存路径和临时目录要一起改
默认情况下,Composer 缓存虽在 %APPDATA%\Composer\cache(通常是 C 盘),但下载解压过程大量依赖系统临时目录:%TEMP% 或 %SystemRoot%\Temp,这两个十有八九也在 C 盘。
- 光改缓存路径没用:
composer config --global cache-dir D:\composer-cache - 必须同步重定向临时目录:
- PowerShell:
$env:COMPOSER_CACHE_DIR="D:\composer-cache"; $env:TMP="D:\tmp"; $env:TEMP="D:\tmp" - 或永久写入系统环境变量,重启终端生效
- PowerShell:
- 验证是否生效:
composer config --global cache-dir和echo %TMP%应都指向非 C 盘路径
不改 TEMP,遇到大包(如 symfony/symfony)解压时依然可能因 C:\Windows\Temp 满而失败,错误信息常是 failed to open stream: No space left on device,但实际是临时目录撑爆了。
缓存不是越久越好,旧包版本不清理,inodes 和磁盘空间都会悄悄见底;手动删 zip 比全量 clear-cache 更省事,但得盯住 composer.lock 里到底用了哪些版本。











