post-install-cmd 是 composer 内置脚本事件,仅在 vendor 目录全新创建时触发,需在 composer.json 的 "scripts" 中严格配置为 "post-install-cmd" 键,支持数组形式多命令顺序执行,失败即中断。

post-install-cmd 是什么,不是钩子也不是插件
post-install-cmd 是 Composer 内置的脚本事件名,不是自定义命令,也不需要额外安装插件。它在 composer install 执行完依赖安装、生成 vendor/autoload.php 后自动触发,但仅当 vendor/ 目录是全新创建(或完全清空后重装)时才运行——如果只是更新部分包,composer update 触发的是 post-update-cmd,不是它。
常见错误现象:post-install-cmd 没执行,其实是你反复跑 composer install,而 vendor/ 已存在且没被删过;或者误写成 post-install(漏掉 -cmd)导致静默忽略。
- 必须写在
composer.json的"scripts"下,键名严格为"post-install-cmd" - 值可以是字符串(单条命令)、字符串数组(顺序执行)、或对象(带
"script"和"description") - 不支持 shell 语法糖,比如
&&、|、变量展开,除非用sh -c "..."包一层
怎么在 composer.json 里正确配置 post-install-cmd
直接改 composer.json 的 "scripts" 段,别套用网上“教程”里带注释模板的 JSON 结构——JSON 不支持注释,加了就报错 JSON decode error。
推荐写法(简洁安全):
"scripts": {
"post-install-cmd": [
"@php artisan clear-compiled",
"@php artisan optimize:clear"
]
}
说明:
-
@php是 Composer 内置别名,等价于当前 PHP 可执行路径,避免硬编码/usr/bin/php或 Windows 下路径问题 - 数组形式天然支持多步,失败会中断后续(符合预期);字符串形式如
"@php foo && @php bar"中任意一步失败,&&后面也不会执行,但属于 shell 层逻辑,不如数组清晰 - 不要写成
"post-install-cmd": "php artisan migrate --force"——没加@就是调系统 PATH 下的 php,可能版本不对;没加--no-interaction在 CI 环境会卡住
为什么本地能跑,CI/CD 里 post-install-cmd 却不执行
根本原因:CI 环境常复用 vendor/ 缓存,composer install 实际走的是“增量安装”,Composer 判定不需要重建 autoload,也就跳过 post-install-cmd。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
解决办法只有两个,选其一:
- 强制清空再装:
rm -rf vendor && composer install(最干脆,适合镜像构建) - 改用
post-autoload-dump—— 它只要autoload.php重生成就触发,不管 vendor 是新是旧;但注意它不保证依赖已全部就位,慎用于需访问第三方类的逻辑 - CI 配置里加
--no-cache和--prefer-dist有时能绕过缓存误判,但不治本
性能影响:清空 vendor/ 会让 CI 多花几秒到十几秒,但比脚本漏执行导致线上 bug 强得多。
post-install-cmd 跑失败了,怎么快速定位
默认 Composer 遇错即停,但不会打印完整堆栈——尤其 PHP 脚本内部报错,只显示 Script @php artisan xxx handling the post-install-cmd event returned with error code 255。
实操建议:
- 先手动跑一遍对应命令:
php artisan clear-compiled,看是否报Class not found——大概率是vendor/autoload.php还没生成完,这时应换用post-autoload-dump - 加
-v参数重试:composer install -v,能看到每条脚本实际执行的命令和 stderr 输出 - 避免在脚本里做耗时操作(如下载文件、调外部 API),它阻塞整个
install流程,本地开发会明显变慢
容易被忽略的一点:脚本中所有路径都基于项目根目录,不是 composer.json 所在目录——如果项目是子模块或软链结构,__DIR__ 在 PHP 脚本里可能指向意外位置。










