post-install-cmd和post-update-cmd是Composer在install或update完成且composer.lock实际更新后执行的脚本钩子,需明确定义于composer.json的scripts段,任一命令失败将中断后续执行。

Composer install/update 后自动触发脚本
Composer 本身不监听文件变动,但支持在 install 或 update 完成后执行自定义命令——这是最可靠、最轻量的“自动执行”方式,无需额外进程或工具。
把脚本写进 composer.json 的 scripts 段,再用 post-install-cmd 和 post-update-cmd 钩子挂载:
{
"scripts": {
"post-install-cmd": [
"@php scripts/generate-config.php",
"npm run build"
],
"post-update-cmd": [
"@php scripts/clear-cache.php",
"composer dump-autoload"
]
}
}
注意点:
-
@php是 Composer 内置快捷方式,等价于调用当前 PHP 可执行文件,避免硬编码路径 - 数组内每项独立执行,任一命令失败会中断后续(除非加
|| true,但不推荐掩盖错误) - 钩子只在 CLI 手动运行
composer install或composer update时触发,CI/CD 中同样生效 - 不要在钩子里调用
composer install自身,会导致递归死循环
想监听 vendor 或 composer.json 变动?别用 Composer 做这事
试图让 Composer “监听文件变化并自动重装”是方向性错误。Composer 不是文件监视器,强行用 inotifywait 或 fswatch 包裹 composer update 会出问题:
- 并发写入
vendor/时可能撞上 Composer 的锁文件(composer.lock正在写入中),报错file_put_contents(./composer.lock): failed to open stream: Permission denied -
composer.json小修小改(比如只改注释)也触发全量 update,浪费时间且易引入意外依赖升级 - 开发时频繁保存配置文件,但你真正需要的只是 reload 配置,不是重装包
真要监听变动,应交由专用工具(如 nodemon、watchexec)驱动明确动作,例如:
watchexec -e "json" --on-change "composer validate && composer dump-autoload" composer.json
这样只在 composer.json 改变时校验+重生成 autoload,不碰 vendor。
PHP 自动加载变更后怎么立刻生效?
很多人以为改了 composer.json 的 autoload 段就要重跑 install,其实只需 composer dump-autoload —— 它只刷新 vendor/autoload.php 映射,快且安全。
常见场景和对应操作:
- 新增一个
"psr-4": {"App\": "src/"}→ 运行composer dump-autoload - 移动了类文件位置,但命名空间没变 → 同样只需
dump-autoload - 删了某个包,又手动删了
vendor/xxx→ 必须composer install或update,否则 autoload 里还留着旧映射,运行时报Class not found
顺带提醒:dump-autoload 默认不优化性能;加 -o(即 composer dump-autoload -o)会生成 classmap,适合生产环境,但开发时禁用,否则改代码后要反复 dump 才能生效。
CI/CD 里自动执行脚本容易漏掉什么?
CI 流水线里常忽略钩子执行上下文差异:
- 默认不启用
COMPOSER_NO_INTERACTION=1,某些脚本卡在交互式提示(如权限确认)上直接超时 - 钩子里调用
npm命令,但 CI 环境没装 Node.js,得提前配好 runtime 或改用纯 PHP 替代方案 -
post-update-cmd在composer update --lock下不会触发,因为没更新依赖,只改 lock 文件 —— 如果你的脚本依赖版本号(比如生成 changelog),就得单独监听composer.lock变更
复杂项目建议把钩子逻辑抽成独立可测试的 PHP 脚本(如 scripts/post-update.php),而不是塞一堆 shell 命令,便于调试和复用。











