post-install-cmd 必须置于 composer.json 顶层 scripts 键下,为字符串或数组格式,仅在首次安装或 composer.lock 不匹配时执行;强制运行需加 --force-scripts,禁用则因 --no-scripts 导致失效。

直接用 post-install-cmd 就行,但必须写对位置、格式和触发条件,否则根本不会执行。
post-install-cmd 必须放在 composer.json 的顶层 scripts 里
它不是子字段,也不是嵌套在 require 或 autoload 下面——放错位置等于没写。
-
"scripts"是和"require"、"autoload"同级的键,整个结构要合法 JSON - 值必须是字符串或字符串数组;单条命令可写成字符串,多条建议用数组(避免 shell 连接符歧义)
- 示例正确写法:
{
"require": { "monolog/monolog": "^2.0" },
"scripts": {
"post-install-cmd": [
"echo '依赖安装完成'",
"php artisan optimize:clear"
]
}
}
它只在特定条件下触发,不是每次 composer install 都跑
post-install-cmd 默认只在「首次安装」或「lock 文件不存在/不匹配」时执行。如果你反复运行 composer install,且 composer.lock 没变,脚本大概率被跳过。
- 想强制执行?加
--force-scripts参数:composer install --force-scripts - CI/CD 中常见误操作:用了
--no-scripts(比如为了提速),结果脚本彻底失效 - 生产部署时如果加了
--no-dev,不影响post-install-cmd,但若同时加了--no-scripts,就全废了
常见失败原因:路径、权限、PHP 环境不一致
脚本是在 Composer 进程里调用的,不是你当前 shell 环境,容易踩环境差异的坑。
- 别写
./artisan,改用php artisan——./在某些系统下找不到可执行位或解析失败 - 不要依赖当前工作目录就是项目根目录,有些插件会切换路径;推荐用
php ${PWD}/artisan或直接写绝对路径(不推荐) - 如果脚本里调用了 Laravel 命令,确保
vendor/autoload.php已生成(post-install-cmd是在 autoload dump 之后触发的,一般没问题;但post-autoload-dump更稳妥) - 错误信息藏得深:加
--verbose能看到脚本实际执行过程和 stderr 输出
真正容易被忽略的是:本地开发时反复 install 不触发,会让你误以为脚本坏了;而生产部署又因漏掉 --force-scripts 或误加 --no-scripts 导致初始化失败——这两点必须在 CI 配置和部署文档里显式标注。











