Composer自身不产生需手动清理的构建临时文件,真正该清的是系统临时目录(sys_get_temp_dir())和自定义脚本生成的中间产物,如public/build/、bootstrap/cache/packages.php等。

不会破坏项目,但“临时文件”必须准确定义——Composer 自身不产生需手动清理的构建临时文件,真正该清的,是它下载解压时用的系统临时目录(sys_get_temp_dir())和你自定义脚本生成的中间产物。
哪些路径属于安全清理范围
Composer 本身不会把 zip 包、解压缓存或 autoload 中间文件写进 vendor/ 或项目根目录;所谓“临时”,实际分三类:
-
sys_get_temp_dir()返回的路径(如/tmp、C:\Users\XXX\AppData\Local\Temp):这里堆积大量composer_*.zip、php-*.phar等临时包,可安全清理 - 项目内自定义构建步骤产出的目录:如
public/build/、bootstrap/cache/packages.php、storage/framework/views/,这些不是 Composer 写的,但常被误认为“Composer 临时文件” - 全局缓存目录(
~/.composer/cache/或%APPDATA%\Composer\Cache):含files/(zip)、vcs/(git 裸库)、repo/(索引),其中vcs/可整删,repo/packagist.org/删了会拖慢首次 update
哪些路径绝对不能碰
直接删错目录会导致 autoload 失败、框架启动报错甚至 CI 崩溃:
-
vendor/下任何子目录:哪怕看起来是“临时生成”的vendor/composer/autoload_*.php,删了composer install就会失败 -
composer.lock:它不是缓存,是依赖状态契约,删了再跑composer install会直接报错或退化为不受控的update -
vendor/autoload.php和vendor/composer/installed.json:这是 Composer 运行基石,钩子里执行rm -f vendor/autoload.php会导致后续所有命令中断 - 未被 Git 跟踪但有语义作用的空文件:如
storage/logs/.gitkeep、tests/fixtures/.gitkeep,删了可能让部署脚本找不到目录而报 Permission denied
清理命令怎么写才不出错
直接在 composer.json 的 scripts 里硬写 rm -rf 很危险,尤其跨平台或路径含空格时。推荐分层处理:
- 系统临时目录清理:用
find $(php -r "echo sys_get_temp_dir();") -name 'composer_*.zip' -delete(Linux/macOS),Windows 改用PowerShell -Command "Get-ChildItem $env:TEMP\composer_*.zip | Remove-Item" - 项目内缓存目录:先判断目录是否存在,再清内容,不删目录本身,例如
if [ -d "bootstrap/cache" ]; then find bootstrap/cache -type f -delete; fi - 避免 shell 解析陷阱:复杂逻辑封装成 PHP 脚本(如
scripts/clean-temp.php),然后在composer.json里调用php scripts/clean-temp.php,路径和权限更可控 - 别在
post-install-cmd里调用composer dump-autoload后立刻删vendor/composer/autoload_static.php——它可能正被下一条命令读取
为什么有时候删了还报空间不足
常见误判是只清了缓存却没动真正的“磁盘杀手”:
-
df -i查 inode 是否耗尽:/tmp下大量小文件(如composer_*.zip)占满 inode,df -h却显示空间充裕 - COMPOSER_HOME 指向小分区:比如
composer config --global cache-dir "C:\Users\XXX\AppData\Roaming\Composer",而 C 盘只剩 2GB,这时换路径比清缓存更有效:composer config --global cache-dir "D:\composer-cache" - PHP 的
opcache.file_cache目录也可能堆积,尤其启用了opcache.file_cache_only=1时,它不在 Composer 管理范围内,但吃空间很猛
真正麻烦的永远不是“删不删”,而是“删什么才算临时”——系统临时目录、自定义构建产物、框架运行时缓存,这三者边界模糊,又常混在同一路径下。动手前先 ls -la /tmp | grep composer 或 dir %TEMP%\composer* 看一眼实际内容,比背命令重要得多。











