post-install-cmd是Composer内置的生命周期钩子,仅在执行composer install且vendor/目录不存在或为空时触发;需在composer.json的scripts字段中声明,支持字符串或数组命令,@php可调用当前PHP,注意CI环境、路径及环境变量差异。

Composer install 后自动执行脚本的原理是啥?
Composer 本身不提供“install 后立刻运行任意命令”的开关,它靠的是 scripts 配置 + 生命周期事件钩子。你写在 composer.json 的 "scripts" 里,再绑定到 post-install-cmd 这类事件上,Composer 才会在 install 完成后自动触发。
怎么配置 post-install-cmd 执行构建命令?
直接改 composer.json 的 scripts 字段,添加 post-install-cmd 键。注意:这个钩子只在首次 composer install(即 vendor/ 不存在时)触发,composer update 不走它。
常见写法示例:
{
"scripts": {
"build": "npm ci && npm run build",
"post-install-cmd": [
"@build",
"php artisan optimize:clear"
]
}
}
-
@build是调用同文件中定义的build脚本,避免重复写命令 - 数组形式支持多个命令,按顺序执行;单个字符串也行,但不利于拆分维护
- 如果命令失败(退出码非 0),整个
composer install会中断,默认行为
为什么有时候 post-install-cmd 没执行?
最常见原因有三个:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
vendor/已存在,你实际执行的是composer update或composer install --no-scripts—— 后者明确禁用所有脚本 -
composer.json改了但没加post-install-cmd,或者拼写错误(比如写成post-install少了-cmd) - 脚本里用了相对路径(如
./node_modules/.bin/vite),但当前工作目录不是项目根目录,导致命令找不到 —— Composer 执行脚本时工作目录是项目根目录,这点通常没问题;但如果你在子目录里跑composer install,就可能出问题
想让 install 和 update 都执行构建,该用哪个钩子?
用 post-autoload-dump 更稳妥。它在 autoloader 生成后触发,install、update、甚至 dump-autoload 都会走,适合需要确保类加载器就绪后再跑的构建任务(比如生成代理类、扫描注解)。
示例:
{
"scripts": {
"build": "php bin/build.php",
"post-autoload-dump": "@build"
}
}
但要注意:post-autoload-dump 触发频率更高,如果构建耗时长或有副作用(如清缓存、重写配置),得自己加判断逻辑,避免重复执行。
真正要区分 install/update 场景时,得靠 $argv 或环境变量传参,Composer 自身不暴露操作类型,这点容易被忽略。

















