仅执行 composer clear-cache 无法实现定期清理,因其无时间判断、不自动触发、不清理vcs/目录;需结合脚本定期删除vcs/和90天前dist包,并配置cache-max-size、迁移缓存路径、禁用cache-vcs。

直接跑 composer clear-cache 并不能实现“定期清理”——它只是单次清空,不带时间判断、不自动触发、也不过滤旧包。真要定期减负,得靠组合策略+手动干预。
为什么不能只靠 composer clear-cache 定期执行
这个命令本身没有时间维度:它不管文件是昨天下的还是三年前的,也不区分哪些包你永远不会再用。更关键的是,它默认跳过 vcs/ 目录——而那里存着 Git 裸仓库,单个就 300–800 MB,且几乎从不复用。你每月跑一次 clear-cache,vcs/ 里的东西还在 silently 吃磁盘和 inodes。
- 执行
composer clear-cache后空间没变?大概率是vcs/还在 - 提示
Cache directory does not exist?可能是路径被COMPOSER_CACHE_DIR覆盖,但命令没读到 - CI 环境卡住?默认会等交互确认,必须加
--no-interaction
Linux/macOS 下可落地的定期清理脚本
把下面这段保存为 ~/bin/composer-prune-cache(记得 chmod +x),再配 cron 每月执行一次:
#!/bin/bash
CACHE_DIR=$(composer config --global cache-dir 2>/dev/null)
[ -z "$CACHE_DIR" ] && exit 1
<h1>先清标准缓存</h1><p>composer clear-cache --no-interaction</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/xiazai/skill3855" title="Discussion Composer"><img
src="https://img.php.cn/upload/skill/000/000/081/178981577668913.jpg" alt="Discussion Composer" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/xiazai/skill3855" title="Discussion Composer">Discussion Composer</a>
<p>围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能:
- “write my discussion”
- “help me discuss my findings”
- “how do I compare to prior studies”
- “write the limitations par</p>
</div>
<a href="/xiazai/skill3855" title="Discussion Composer" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><h1>强制清 vcs(这才是大头)</h1><p>if [ -d "$CACHE_DIR/vcs" ]; then
rm -rf "$CACHE_DIR/vcs"/*
fi</p><h1>可选:只留最近 90 天的 dist 包(files/ 下 zip)</h1><p>if [ -d "$CACHE_DIR/files" ]; then
find "$CACHE_DIR/files" -name "*.zip" -mtime +90 -delete 2>/dev/null
fi- 不用
sudo,除非你之前用 root 跑过composer install(那得先chown -R $USER ~/.composer/cache) -
find ... -mtime +90是最接近“定期清理旧版”的实用方案,Composer 自身不提供按时间删包能力 - 别对
repo/目录做类似操作——删了会导致下次composer update卡在拉packages.json
Windows 用户怎么安全定期清理
PowerShell 脚本比批处理更可靠,尤其要处理路径空格和权限问题:
$cacheDir = composer config --global cache-dir 2>&1
if ($cacheDir -match '^\s*$') { exit 1 }
<p>composer clear-cache --no-interaction</p><p>$vcsPath = Join-Path $cacheDir "vcs"
if (Test-Path $vcsPath) {
Remove-Item "$vcsPath*" -Recurse -Force -ErrorAction SilentlyContinue
}</p><h1>清 90 天前的 zip(需要 PowerShell 5.1+)</h1><p>$filesPath = Join-Path $cacheDir "files"
if (Test-Path $filesPath) {
Get-ChildItem "$filesPath*.zip" | Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-90) } | Remove-Item -Force
}- 不要用资源管理器手动删
vcs/—— 杀毒软件或 PHPStorm 常锁住其中文件,导致删一半失败 - 如果执行后报错
Access is denied,关掉所有 IDE 和杀软再试,或改用管理员 PowerShell(仅限必要时) -
Remove-Item ... -Force是必须的,否则遇到只读文件会中断
真正省事的长期方案:限制+迁移+禁用
定期清理是补救,不是根治。以下三件事做完,后续基本不用操心缓存膨胀:
- 设上限:
composer config --global cache-max-size "1G"(Composer 2.5+ 支持) - 迁路径:
composer config -g cache-dir /data/composer-cache(避开/home或 C:\) - 禁 VCS:
composer config --global cache-vcs false(强制所有 Git 包走--prefer-dist)
最后提醒一句:别在 vendor/ 上打缓存主意——它不属于 Composer 缓存体系,删了项目就挂。你看到的磁盘告警,八成是 vcs/ 里躺着三个 Laravel 仓库副本,而不是 files/ 下那些 zip。

















