composer的scripts数组不支持真正的链式调用,因其逐条执行且忽略退出码;需用shell的&&操作符或独立脚本实现失败中断与流程控制。

不支持真正的链式调用——scripts 数组只是依次执行,不检查上一步退出码,失败也不中断。 想实现“前一步失败、后一步不跑”的可靠链式流程,必须绕过 Composer 的数组语法,改用 shell 控制流或独立脚本。
为什么 scripts 数组不是链式执行
在 composer.json 里写成这样:
"scripts": {
"build": ["@clear", "@compile", "@test"]
}
看起来是链式,但 Composer 实际干的是 foreach 调用,每条命令都单独 exec(),完全忽略上一条的退出码。比如 @compile 编译失败了,@test 仍会照常跑。
- 调试困难:错误堆栈混在多条输出里,分不清哪步挂了
- 无法传递中间产物(如生成的路径、临时文件名)给下一步
- 不能做条件判断(比如“只有测试通过才部署”)
- Windows CMD 下
&&不可用,而 Composer 本身不处理平台兼容性
用 && 实现带中断的 shell 链式
最直接的办法:把整个流程写成一条 shell 命令,用 && 连接:
"scripts": {
"build": "php artisan clear-compiled && php artisan optimize:autoload && npm run build"
}
任意一步返回非零退出码(比如 npm run build 报错),后续命令立刻终止,行为可预测、语义清晰。
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 适合 3–4 步以内的短流程,可读性好
- 注意:Windows 默认 CMD 不支持
&&,建议统一用 Git Bash / WSL / PowerShell(PowerShell 用;+$?判断) - 若某步允许失败继续(如清理旧目录),可加
|| true:rm -f vendor-old && cp -r vendor vendor-old || true
复杂流程必须拆到独立脚本
一旦构建逻辑超过 5 行、涉及重试、环境判断、日志记录或变量注入,硬塞进 composer.json 就是自找麻烦。
- 新建
bin/build.sh(Linux/macOS)或bin/build.bat(Windows) - 把完整逻辑写进去,支持注释、函数封装、
set -e全局失败中断 - 在
composer.json中调用:"build": "sh bin/build.sh" - 别忘了加执行权限:
chmod +x bin/build.sh
这类脚本可单独测试、可复用、可被 CI 直接调用,也避免了 composer run-script 递归调用时的进程开销和环境污染。
别踩 @script-name 的坑
有人用 @clear 在数组里引用其他脚本,以为能模拟链式。但这是 Composer 的别名展开机制,本质仍是独立调用,不传播退出码,也不共享上下文。
-
@引用只解决命名复用,不解决流程控制 - 嵌套调用(如 A 脚本里再
system('composer run B'))会启动新进程,导致环境变量丢失、内存重复加载、调试断点失效 - CI 环境中尤其危险:可能触发意外的生命周期钩子(如
post-autoload-dump)被多次执行
真正要控制流程,就得把决策权交还给 shell 或 PHP 脚本——Composer 的 scripts 只是入口,不是引擎。










