应使用 post-autoload-dump 而非 post-update-cmd 清理应用缓存,因它在 autoload.php 生成后触发,确保框架类可用;同时需配合 php artisan config:clear 等命令清除 bootstrap/cache/ 下的运行时缓存,而非 composer clear-cache。

不能只靠 post-update-cmd 直接调用 composer clear-cache 就完事——它清的是全局缓存,和你项目运行时的缓存(比如 Laravel 的 bootstrap/cache/config.php)完全不是一回事,且 CI 环境下不加 --no-interaction 会卡死。
post-update-cmd 真的在“更新后”执行吗?
只在你显式运行 composer update 时触发,composer install 或 composer require 不会触发它(除非后者内部调用了 update)。CI 流水线里常用 composer install --no-scripts,这时 post-update-cmd 根本不会跑,脚本形同虚设。
- 常见错误现象:
composer install部署后缓存没清,页面报错“Class not found”,但本地composer update却正常 - 根本原因:部署走的是 install 流程,而你的清理逻辑只绑在
post-update-cmd上 - 正确做法:如果目标是“每次依赖变更后都清应用缓存”,应同时配置
post-install-cmd和post-update-cmd,或改用更可靠的post-autoload-dump
为什么 composer clear-cache 不解决你的问题?
这个命令只清理 Composer 自己的全局下载缓存(~/.composer/cache 或 $COMPOSER_CACHE_DIR),不影响框架生成的运行时缓存文件。你遇到的“修改了 config 却不生效”“路由没刷新”,根源在 bootstrap/cache/ 或 var/cache/ 下。
-
composer clear-cache清的是.zip包和元数据,不是config.php或routes-v7.php - 它还会清掉其他项目的缓存,CI 中可能拖慢后续构建
- 必须加
--no-interaction,否则在 GitHub Actions、GitLab CI 里会 hang 住 - 真正该清的,是
php artisan config:clear、php bin/console cache:clear这类命令
清应用缓存,应该用 post-autoload-dump 而不是 post-update-cmd
post-autoload-dump 在 vendor/autoload.php 已成功生成后触发,此时 artisan 或 bin/console 才能真正加载框架类并执行命令。而 post-update-cmd 可能在 autoload 文件写入前就启动,导致 Class 'Illuminate\Foundation\Application' not found。
- 推荐写法(Laravel 示例):
"scripts": { "post-autoload-dump": [ "@php artisan config:clear --no-interaction --env=production", "@php artisan cache:clear --no-interaction --env=production", "@php artisan route:clear --no-interaction --env=production" ] } - 不要在脚本里用
exec()或shell_exec(),Composer 对多层调用支持不稳定 - 避免硬编码
--env=production,可改用@php -r "putenv('APP_ENV=production'); require 'artisan';",但前提是环境变量已就绪 - Windows 下注意路径分隔符,
rm -rf要换成del /q,且 Composer 默认走cmd.exe,不是 PowerShell
CI/CD 中更稳妥的清理姿势
别依赖 Composer 脚本自动触发——GitHub Actions、Jenkins 等常禁用脚本以求确定性。直接在 workflow 步骤里控制更可靠:
- 先清 Composer 全局缓存:
composer clear-cache --no-interaction - 再删整个
vendor目录:rm -rf vendor(比只清archives/更彻底) - 最后装依赖:
composer install --no-interaction --prefer-dist - 如果用了自定义缓存路径,记得在 CI 中同步设置
COMPOSER_CACHE_DIR环境变量 - 对 Docker 构建,还要确认 PHP 扩展(如
redis、opcache)已安装,否则artisan会因 Class not found 失败
最易被忽略的一点:post-autoload-dump 虽然时机可靠,但它不保证 APP_ENV 已加载——.env 文件若在 vendor 之外、且未被复制进构建上下文,artisan 仍可能读成 local,清错缓存。


















