composer脚本中调用清理命令需在composer.json的"scripts"段定义自定义脚本,类型为"script",优先用php封装(如"php scripts/clean.php")以避免rm/del跨平台问题,并严格限定清理范围为非运行时目录。

Composer脚本里怎么调用清理命令?
Composer 本身不提供内置的“清理”功能,所有清理动作都得靠外部命令驱动。你得在 composer.json 的 "scripts" 段里定义一个自定义脚本,然后用 php、rm、del 或跨平台工具(如 robocopy /purge 或 rimraf)来执行实际删除。
- 脚本类型选
"script"(不是"command"),否则 Composer 不会识别为可运行项 - 命令必须是 shell 可执行的:Linux/macOS 用
rm -rf,Windows 默认不认rm,得用del /q /s或加条件判断 - 推荐优先使用 PHP 脚本封装清理逻辑,避免平台差异问题
例如,在 composer.json 中添加:
"scripts": {
"clean:tmp": "php -r \"array_map('unlink', glob('var/cache/*')); rmdir('var/cache'); mkdir('var/cache');\""
}
为什么不能直接写 rm -rf var/cache?
看似简单,但直接写 shell 命令会导致跨平台失败:Windows 下 rm 不是内置命令,Composer 运行时会报错 'rm' is not recognized as an internal or external command。
- Composer 在 Windows 上默认用 cmd.exe 执行脚本,不是 PowerShell 或 Git Bash
- 即使你本地能跑通,CI 环境(如 GitHub Actions 的 windows-latest)大概率失败
-
del /q /s var\cache 2>nul && mkdir var\cache可以工作,但路径分隔符、转义、空格处理麻烦
更稳妥的做法是把清理逻辑抽成独立 PHP 文件(如 bin/clean.php),再在脚本中调用:
"clean:tmp": "php bin/clean.php"
如何安全地清理缓存目录而不误删?
清理的核心风险不是“删不掉”,而是“删多了”。常见误操作包括:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 使用
glob('var/*')误匹配var/log或var/sessions - 忘记排除
.gitkeep导致后续 git 提交异常 -
rmdir()对非空目录失败,但没做兜底处理
建议按以下方式组织清理逻辑:
- 先明确要清理的子目录白名单(如
['cache', 'temp', 'build']) - 对每个目标目录,先
scandir()并过滤掉.、..和.gitkeep - 用
array_map('unlink', $files)清空文件,再用rmdir()删空目录,最后mkdir()重建 - 加上
@抑制警告(如目录不存在),或用is_dir()显式判断
CI/CD 中执行清理脚本要注意什么?
CI 环境常因权限、路径或缓存残留导致清理失败:
- GitHub Actions 的
ubuntu-latest默认以runner用户运行,对/tmp有权限,但对项目外路径可能无权写入 - Docker 环境中,如果挂载了 volume,
rm -rf var/cache只删容器内副本,宿主机数据还在 - Composer 自身缓存(
~/.composer/cache)不能通过项目脚本清理,那是全局行为,需单独用composer clear-cache
如果你真想清 Composer 全局缓存,别混进项目脚本——它和你的 var/cache 完全是两回事,强行合并只会让职责混乱。
清理这件事,最麻烦的从来不是写几行命令,而是搞清楚“到底该删谁”和“删完之后谁来保证目录结构完好”。尤其当多个脚本共用同一缓存路径时,顺序和原子性就更关键。










