脚本没执行大概率是位置错误、钩子名拼错或命令返回非零退出码;scripts必须置于composer.json根层级,与require同级,不可嵌套在extra或config中,且post-install-cmd仅在vendor为空时触发,post-update-cmd才响应update操作。

脚本没执行,大概率是 scripts 写错位置、钩子名拼错,或命令返回非零退出码被 Composer 中断——不是功能失效,而是配置或环境问题。
scripts 必须写在 composer.json 根层级
很多人把 scripts 嵌套进 extra 或 config 里,结果脚本完全不触发。它只能是 composer.json 最外层的键,和 require、autoload 并列。
- ✅ 正确写法:
"scripts": { "post-install-cmd": "php think make:runtime" } - ❌ 错误写法:
"extra": { "scripts": { ... } }或"config": { "scripts": { ... } } - JSON 语法必须严格:所有引号为英文双引号,末尾不能有多余逗号,否则整个
scripts被忽略
post-install-cmd 和 post-update-cmd 的区别很关键
这两个钩子触发时机完全不同,混用会导致本地开发和 CI 环境行为不一致。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(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)运行;CI 流水线拉完代码后一般走这个 -
post-update-cmd在composer update或带--with-dependencies的install后运行;本地更新依赖后需同步清理缓存就靠它 - 如果只配了
post-install-cmd,composer update后不会清缓存,runtime/权限也不会重设 - ThinkPHP 项目常见组合:
"post-install-cmd": ["@php think make:runtime", "chmod -R 755 runtime/"](Linux/macOS)
命令失败会中断后续脚本,要小心 exit code
Composer 默认只要某条命令返回非零退出码,就停止执行当前脚本数组里的剩余命令,并报错退出——哪怕只是 ls nonexistent-dir 这种调试命令。
- 加
|| true可绕过(如"ls config/ || true"),但仅用于调试,生产环境慎用 - Laravel 的
php artisan migrate --force必须带--force,否则在无交互环境下卡住并返回 1 - Windows 下避免直接写
chmod,改用powershell -Command "icacls runtime /grant Users:(OI)(CI)F" - 路径要显式写全:
php ./think比php think更可靠,不依赖 PATH 或当前工作目录
调试脚本是否生效最直接的方法
别等 composer install 跑完再猜,手动触发 + 加日志点能快速定位问题。
- 运行
composer run-script post-install-cmd -v,看输出里有没有Executing command和具体命令回显 - 临时插入
"echo '>> post-install starting'"到脚本数组开头,确认钩子注册成功 - 检查是否被
--no-scripts抑制:CI 部署脚本里若写了这参数,所有scripts都跳过,包括生成runtime/目录这种关键步骤 - 注意权限:某些 Docker 环境中
php进程用户没有写runtime/的权限,命令看似执行成功,实则创建失败
真正容易被忽略的是钩子执行顺序和环境差异:同一段 post-update-cmd 在开发者本地可能跑通,在 CI 容器里因缺少 phpunit 或 npm 而失败,得用 vendor/bin/phpunit 这种绝对路径兜底。










