Turborepo中如何设置dev流水线执行顺序,优先启动shared?
解决TurboRepo中Dev服务启动顺序问题
以下是几个可行的方案,解决shared未就绪导致api启动失败的问题:
方案1:分阶段手动/脚本化启动
利用Turbo的--filter参数拆分启动流程,确保shared服务就绪后再启动其他服务:
- 手动方式:
- 第一个终端执行:
turbo run dev --filter=shared,等待shared的热重载服务完全启动(比如控制台输出服务就绪的日志) - 第二个终端执行:
turbo run dev --filter=!shared,启动api和web的dev服务
- 第一个终端执行:
- 脚本化自动启动(推荐):
可以用Shell脚本结合端口检测工具(如wait-for-it或系统自带的nc),自动等待shared服务就绪后启动其他服务。示例脚本:
若没有# 启动shared的dev服务并后台运行 turbo run dev --filter=shared & # 等待shared服务的端口(假设为3001)就绪,替换为实际端口 wait-for-it localhost:3001 -- timeout=30 # 启动其余服务 turbo run dev --filter=!sharedwait-for-it,也可以用nc命令实现简单检测:turbo run dev --filter=shared & while ! nc -z localhost 3001; do sleep 1; done turbo run dev --filter=!shared
方案2:给shared的Dev脚本添加就绪标记并监听
修改shared的package.json中的dev脚本,当服务完全启动后输出特定标识字符串:
{ "scripts": { "dev": "your-dev-command && echo \"SHARED_SERVICE_READY\"" } }
然后编写Shell脚本监听该输出,触发后续服务启动:
#!/bin/bash # 启动shared的dev并监听输出 turbo run dev --filter=shared | while read -r line; do echo "$line" # 匹配就绪标识 if [[ "$line" == *"SHARED_SERVICE_READY"* ]]; then # 启动api和web的dev服务 turbo run dev --filter=!shared & fi done
执行该脚本即可自动按顺序启动所有服务。
方案3:添加前置准备任务结合Turbo依赖
给shared新增一个一次性的prepare-dev脚本,完成初始化(如预编译代码)后退出,再让api和web的dev任务依赖这个前置任务:
- 修改
shared/package.json:
{ "scripts": { "prepare-dev": "tsc --project tsconfig.json", // 假设是TypeScript项目,预编译一次代码 "dev": "tsc --watch & node dist/index.js" // 启动热重载监听和服务 } }
- 修改
turbo.json的pipeline配置:
{ "pipeline": { "prepare-dev": { "cache": false }, "dev": { "cache": false, "dependsOn": ["^prepare-dev"], "persistent": true } } }
执行turbo run dev时,Turbo会先执行所有依赖的prepare-dev任务(即shared的预编译),完成后再启动所有dev服务,确保api启动时shared的代码已就绪。
内容的提问来源于stack exchange,提问作者JC97
相关产品推荐
相关产品推荐

