应使用 post-autoload-dump 事件清理依赖,因其在 autoload.php 生成完毕后触发,确保类可加载、命令安全执行,覆盖 install/update/dump-autoload 全场景且不受 --no-scripts 影响。

直接在 composer.json 里配 scripts 就能自动清理,但多数人卡在「脚本不执行」「清了又留旧包」「CI 里直接 hang 住」——核心问题不是不会写,而是没搞清事件触发时机、环境权限和跨平台陷阱。
post-install-cmd 和 post-update-cmd 为什么常失效
这两个事件在 Composer 安装/更新命令**结束前**就触发,此时 vendor/autoload.php 可能还没写完,php artisan 或 rm -rf 很容易报错 Class not found 或 Permission denied。尤其在 CI/CD 中,composer install --no-scripts 默认跳过所有脚本,根本不会进这个阶段。
-
post-install-cmd只在首次安装时运行,换分支重装vendor不触发 -
post-update-cmd不覆盖composer update --lock这类只改锁文件的操作 - 命令中若含交互式操作(如未加
--no-interaction),CI 会永久卡住 - Windows 下用
rm -rf直接失败,得换成del /q+rmdir /s /q
真正可靠的清理入口是 post-autoload-dump
这个事件在 vendor/autoload.php 和全部 autoload_*.php 文件生成完毕后才触发,类已可加载,artisan 命令、find、rm 都能安全执行。它覆盖 install、update、dump-autoload 所有场景,且不受 --no-scripts 影响(除非显式禁用)。
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
- 配置示例:
"post-autoload-dump": ["@php artisan config:clear --no-interaction", "rm -rf var/cache/*"] - 必须加
--no-interaction,否则 Laravel/Symfony 命令可能等待输入 - 不要在一条命令里链式调用多个
&&,Composer 对 shell 语法支持不稳定,分开写更稳 - PHP 脚本比 shell 更跨平台,推荐封装成
php scripts/clean.php并在脚本内做file_exists()判断
CI/CD 环境必须手动分步清理
GitHub Actions、GitLab CI 这类环境默认不走 Composer 脚本生命周期,靠 post-* 事件纯属碰运气。必须在 workflow 步骤里显式控制顺序:
- 先运行
composer clear-cache --no-interaction清全局缓存 - 再
rm -rf vendor彻底删项目级依赖(比只删vendor/composer/archives/更干净) - 最后
composer install --no-interaction --prefer-dist --optimize-autoloader -
--prefer-dist强制走 zip 包安装,避免 git clone 缓存干扰版本一致性 - 别信
composer update --with-dependencies能清理包,它只是更新,不是卸载
清理逻辑里最容易误删的三类路径
很多人一通 find vendor -name tests -exec rm -rf {} + 后,项目跑不起来。不是命令写错了,是删到了 Composer 自身依赖的元数据。
- ✅ 安全删:
vendor/*/tests、vendor/*/docs、vendor/*/example、vendor/*/CHANGELOG.md - ⚠️ 高风险删:
vendor/composer/*.json——installed.json被删会导致composer show失效,但archieves/可删 - ❌ 绝对禁止删:
vendor/autoload.php、vendor/composer/autoload_*.php、vendor/{package}/src(哪怕你认为它“没用”) - 删之前先
composer show --installed | grep xxx确认包名,别靠目录名猜
真正难的不是写几行脚本,而是判断「该不该在这一步删」「删了会不会让下个步骤找不到类」「CI 里哪一步必须由 workflow 控制而非 Composer 自动触发」——这些边界不厘清,自动化只会变成定时炸雷。










