在 composer.json 的 "scripts" 段落中定义 "post-install-cmd" 数组,仅在 vendor/ 为空时运行 composer install 才触发,支持 @php 调用内置 PHP、按序执行命令,需注意权限、路径及与 post-update-cmd 的区别。

composer.json 里怎么写 post-install-cmd 钩子
Composer 支持在依赖安装完成后自动执行命令,关键是在 composer.json 的 "scripts" 段落里定义 "post-install-cmd"。它只在运行 composer install(且 vendor/ 为空或被清空后)时触发,不会在 composer update 时执行——这点容易误以为“装完就跑”,结果发现没反应。
正确写法示例:
{
"scripts": {
"post-install-cmd": [
"@php artisan clear-compiled",
"chmod +x bin/deploy.sh && bin/deploy.sh"
]
}
}
- 数组内每项是独立 shell 命令,按顺序执行;支持以
@开头调用其他脚本(如@php或自定义脚本名) - 如果某条命令失败(返回非 0 状态),后续命令默认仍会继续执行;需加
&&显式串联才能中断 - 路径基于项目根目录,不是
vendor/或当前工作目录,别写错bin/或resources/的相对位置
post-install-cmd 和 post-update-cmd 的区别与误用场景
很多人想“每次装完依赖都跑一遍构建”,却只配了 post-install-cmd,结果 composer update 后啥也没发生——因为那是 post-update-cmd 的职责。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
post-install-cmd:仅当vendor/不存在或composer install --no-dev导致重装时触发 -
post-update-cmd:只要运行composer update(无论是否带参数)就触发 - 若需统一行为,可共用一个自定义脚本名,再在两个钩子里都引用它,例如:
"post-install-cmd": ["@build-assets"]和"post-update-cmd": ["@build-assets"] - 注意:本地开发中反复
install/update切换时,钩子可能不按预期触发,建议用composer install --no-cache强制重走流程验证
钩子中调用 PHP 脚本的路径与环境问题
在钩子里直接写 php script.php 很危险:它依赖系统 PATH 中的 PHP 版本,而 Composer 自己用的可能是不同版本(比如通过 php8.2 安装的 Composer 却调用了系统默认的 php7.4)。
- 推荐用
@php——这是 Composer 内置的快捷方式,自动匹配当前运行 Composer 的 PHP 可执行文件 - PHP 脚本路径要写对:如果脚本在项目根目录下,就写
@php build.php;如果在scripts/子目录,得写@php scripts/build.php - 不要假设
$_SERVER['PWD']或getcwd()是项目根目录;钩子执行时工作目录确实是项目根,但某些 IDE 或 CI 环境可能覆盖它,建议脚本内部用__DIR__或dirname(__FILE__)定位资源 - 避免在钩子里做耗时操作(如下载远程 asset、编译大型前端包),否则
composer install会卡住,CI 流水线容易超时
调试钩子不执行的常见原因
钩子写了却没动静,大概率不是语法错,而是触发条件或权限没满足。
- 检查是否真的运行了
composer install:composer require xxx不会触发post-install-cmd,它走的是post-autoload-dump - 确认
vendor/目录是否为空或被删过;如果已有vendor/且只是新增一个包,install实际走的是增量更新逻辑,不触发该钩子 - Linux/macOS 下 shell 脚本缺少执行权限会导致静默失败;用
chmod +x显式授权,别依赖钩子内部去改 - 查看完整输出加
-v参数:composer install -v,能看到钩子是否被识别、命令是否被解析、执行时 stdout/stderr 是否有报错
钩子本质是 shell 层的胶水逻辑,不是 PHP 生命周期的一部分;它灵活但脆弱,复杂流程建议抽成独立可测试的 CLI 命令,再由钩子调用。

















