Composer scripts 数组非真链式执行,因忽略上步退出码致失败不停止;应使用 shell 的 && 连接命令或独立可维护脚本实现可靠链式流程。

Composer 本身不支持脚本链式执行(即自动按顺序跑完一个再跑下一个),必须靠 shell 命令或自定义脚本中转。 它的 scripts 字段只支持单条命令或数组形式的「并行」调用(实际是依次执行,但无错误中断保障),真要“链式”——得手动控制流程、错误传播和退出码。
为什么 scripts 数组不是真正的链式执行
在 composer.json 里写:
"scripts": {
"build": [
"@clear",
"@compile",
"@test"
]
}
看起来像链式,但 Composer 会把数组里每个元素当作独立命令调用,**忽略上一条的退出码**。比如 @compile 失败了,@test 仍会运行。这不是 CI 场景想要的“失败即停”链式。
- 它本质是
foreach调用,不检查exec()返回值 - 无法传递变量或中间产物(如生成的文件路径)到下一步
- 调试困难:错误堆栈混在多条命令输出里
用 shell 命令实现带中断的链式执行
最直接可靠的方式:在 scripts 里写一行 shell 命令,用 && 连接:
"scripts": {
"build": "php artisan clear-compiled && php artisan optimize:autoload && npm run build"
}
这样任意一步失败(非零退出码),后续命令立刻终止。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
-
&&是 shell 层面的链式,语义清晰、行为可预测 - 适合短流程(3–4 步),可读性好
- 注意:Windows CMD 不支持
&&,PowerShell 用;+$?判断,建议统一用 Git Bash 或 WSL - 如果某步需忽略失败继续(如可选清理),改用
|| true:rm -f vendor-old && cp -r vendor vendor-old || true
复杂流程该用独立脚本而不是塞进 composer.json
当构建步骤超过 5 行、涉及条件判断、环境变量注入或重试逻辑时,硬塞进 scripts 会让 composer.json 变成不可维护的字符串拼接现场。
- 新建
bin/build.sh(Linux/macOS)或bin/build.bat(Windows),把完整逻辑写进去 - 在
composer.json中调用它:"build": "sh bin/build.sh" - 好处:可测试、可调试、可复用、支持注释和函数封装
- 注意权限:Linux/macOS 下记得
chmod +x bin/build.sh
别忘了 composer run-script 的递归陷阱
有人试图用 @script-name 在不同脚本间跳转来“模拟链式”,比如:
"scripts": {
"step1": "echo 'first'",
"step2": "echo 'second'",
"chain": ["@step1", "@step2"]
}
这看似链式,但 @step1 和 @step2 是两次独立的 composer run-script 进程,**环境变量、工作目录、临时文件不会自动继承**。更麻烦的是,如果 step1 启动了一个后台服务(如 php -S),它会在子进程里被杀掉,根本留不到 step2 用。
- 这种写法适合“无状态、无依赖”的并行任务(如同时清缓存 + 清日志)
- 真要跨步骤共享状态,必须显式写入文件或环境变量,并在下一步主动读取
- CI 环境尤其要注意:Docker 容器内多次
composer run-script会反复加载 autoloader,可能引发内存或性能问题
链式执行的核心从来不是语法糖,而是对退出码的尊重和对上下文的掌控。Composer 的脚本机制是便利层,不是流程引擎——该交给 Makefile、Bash 或专用工具(如 Just、Taskfile)的事,别硬压给 composer.json。

















