Composer scripts 中多命令串联应使用数组形式,如["php artisan migrate", "php artisan cache:clear"],命令按序执行且前一条失败则中断;需容错时可用sh -c封装,但推荐拆分为PHP脚本统一管理。

composer scripts 里怎么写多命令串联
Composer 的 scripts 字段本身不支持 shell 风格的 && 或 ; 直接拼接,但可以通过数组形式声明多个命令,它们会按顺序执行——前提是每个命令都成功退出(即返回码为 0)。这是最常用也最稳妥的串联方式。
- 在
composer.json的scripts下,用数组定义命令列表,例如:"migrate-and-clear": [ "php artisan migrate --force", "php artisan cache:clear", "php artisan view:clear" ]
- 每条命令独立运行,上一条失败(比如迁移报错)会中断后续执行,符合“安全串联”预期
- 不能跨行写成单个字符串(如
"php artisan migrate && php artisan cache:clear"),否则会被当做一个命令传给 shell,而 Composer 默认不经过 shell 解析,容易出错或被忽略 - 如果某条命令本身需要 shell 特性(比如管道、变量替换),得显式调用
sh -c或bash -c,但要小心可移植性(Windows 不兼容)
什么时候该用 post-install-cmd 而不是自定义脚本
如果你希望某些操作在每次 composer install 后自动触发(比如新同事拉代码后一键建库),就该用生命周期事件,而不是手动运行的自定义脚本。这类事件天然支持多命令数组,且无需人工干预。
-
post-install-cmd和post-update-cmd是最常用于串联部署任务的钩子 - 它们在 Composer 内部以相同方式处理数组命令,行为一致,不用额外封装
- 注意:这些事件只在对应 Composer 命令结束时触发,不会在
composer run-script中自动执行 - 若需在 CI/CD 中复用同一组逻辑,建议把核心操作抽成独立脚本(如
bin/migrate-and-warmup),再让post-install-cmd和自定义脚本都调用它,避免重复配置
如何让失败命令不中断后续执行
默认情况下,任意一条命令退出码非 0,整个脚本就终止。如果你明确需要“尽力而为”(比如清理缓存失败不影响迁移),就得绕过 Composer 的内置串联机制。
- 把多条命令合并进一个 shell 封装中,例如:
"migrate-then-clear-ignore-errors": "sh -c 'php artisan migrate --force; php artisan cache:clear; php artisan view:clear'"
- 这样所有命令都在同一个 shell 进程里跑,不受 Composer 逐条校验退出码的限制
- 风险在于:错误被吞掉,日志不清晰;CI 流程可能误判成功;无法单独调试某一步
- 更可控的做法是写一个轻量 PHP 脚本(如
scripts/run-migration-safe.php),用proc_open()执行各命令并自行处理返回值,再统一输出结果
环境变量和参数传递的常见坑
串联任务经常需要区分环境(dev vs prod)或传参(比如指定 migration batch),但 Composer 脚本对参数支持有限。
-
composer run-script支持传参,但只到脚本一级,不会自动透传给数组里的每条命令;例如composer run-script migrate-and-clear -- --env=prod,只有第一个命令能收到--env=prod,后面两条不会 - 正确做法是把参数集中交给一个入口命令(如 Laravel 的 Artisan),让它内部调度多个子任务;或者改用
php scripts/deploy.php --env=prod这类自定义 PHP 脚本 - 环境变量可用
$_ENV或getenv()读取,但注意:在 Windows 上用set FOO=bar & composer run-script xxx不可靠,推荐统一用.env文件或 Composer 的config.platform - 别在脚本里硬编码数据库密码等敏感信息——串联任务越长,泄露面越大;应始终依赖框架自身的环境配置机制
多任务串联看着简单,真正难的是错误边界控制和环境一致性。数组写法干净,但容错弱;shell 封装灵活,但调试成本高。实际项目里,超过 3 步的串联逻辑,基本都应该拆进 PHP 脚本里管理。


















