post-install-cmd仅在composer install真正从零安装依赖时触发,即vendor目录不存在或为空、composer.lock缺失或不匹配,且未加--no-scripts;事件名须严格为"post-install-cmd",配置于composer.json的scripts下,否则静默失效。

它只在 composer install 真正从零安装依赖时触发,不是每次运行都执行;写错事件名、加了 --no-scripts、vendor 已存在,都会让它静默失效。
post-install-cmd 什么时候会真正运行
这个钩子不是“只要敲了 composer install 就跑”,它的触发条件非常具体:
- 项目根目录下没有
vendor/目录,或该目录为空 -
composer.lock不存在,或内容与composer.json中声明的依赖不一致(比如你改了require但没更新 lock) - 没传
--no-scripts参数(CI 环境默认可能加这个) - 脚本定义在根目录
composer.json的"scripts"字段下,且键名严格为"post-install-cmd"(不是PostInstall、post_install_cmd或其他变体)
常见误判:本地 composer install 没反应 → 很可能是 vendor 已存在,Composer 直接跳过初始化流程,此时应改用 post-update-cmd 或清空 vendor 后重试。
怎么在 composer.json 里安全写命令
数组形式是首选,避免 shell 解析歧义和空格陷阱:
工作流任务拆解与模型编排技能。使用场景:(1) 收到复杂工作任务需要拆解为可执行步骤,(2) 需要为不同步骤选择最合适的模型,(3) 需要跟踪工作流进度和模型使用情况,(4) 长时间任务卡住需要问题诊断和解决方案。
{
"scripts": {
"post-install-cmd": [
"@php -r \"file_put_contents('runtime/.installed', date('c'));\"",
"php artisan config:clear",
"php scripts/generate-config.php"
]
}
}
- 用
@php而不是裸写php,确保调用的是 Composer 当前环境绑定的 PHP 可执行文件 - 外部命令如
npm install必须确认系统 PATH 中已存在,CI 镜像要提前装好 Node.js - PHP 脚本建议用
php -f script.php显式调用,别依赖文件可执行权限(./script.php容易因权限失败) - 不要在脚本里写
cd ../some-dir—— Composer 执行时工作目录就是composer.json所在路径,硬切反而导致路径错乱
为什么脚本看起来配置对了却没执行
最常踩的坑不在语法,而在执行上下文:
-
sh: 1: php: not found→ 容器或 CI 环境没装 PHP,或 PATH 未包含其路径 -
sh: 1: artisan: not found→artisan缺少可执行位,应改用php artisan - 脚本中用了
mb_strtolower()却没启用mbstring扩展 → 报错但可能被静默吞掉,建议开头加echo "running post-install-cmd"排查 - 相对路径失效,比如
../config/app.php→ 改用__DIR__ . '/config/app.php'或getcwd()动态拼接 - 脚本需要加载自动加载器(如调用第三方类),但没显式
require __DIR__ . '/vendor/autoload.php';
post-install-cmd 和 post-update-cmd 到底该选哪个
这不是“哪个更好”,而是“哪个更准”:
-
post-install-cmd:适合一次性动作,比如生成APP_KEY、复制.env.example、初始化 storage 权限 -
post-update-cmd:适合每次依赖变更都要同步的动作,比如重建 Laravel Telescope 表、刷新 Swagger 文档、运行composer dump-autoload --optimize - 想“每次
composer install都执行”,得同时注册两个事件,或统一用post-autoload-dump(它只要 autoload.php 重生成就触发,但注意此时第三方类不一定已就位)
真正容易被忽略的是:CI 流水线经常复用 vendor 缓存,导致 post-install-cmd 根本不触发;与其反复调试时机,不如把关键初始化逻辑抽成独立 PHP 脚本,由部署流程显式调用,可控性更高。










