如何通过编程方式使用concurrently运行npm工作区命令且不生成新终端窗口?
用concurrently API在同一终端运行npm工作区多包start脚本
你的代码需要几处调整,就能实现同一终端运行所有脚本且不新开窗口:
关键修正点
- 补全完整命令:每个子包的
command需指定为npm run start,concurrently需要完整的可执行命令,直接写start无法被正确识别。 - 兼容顶层await环境:要么在
package.json中设置"type": "module",要么把代码包裹在async函数中执行,避免环境不支持顶层await的报错。 - 优化日志区分:
raw: true会关闭日志前缀和颜色,不利于区分不同子包的输出,建议改用prefix: "{name}"显示子包名称作为日志前缀。
修正后的完整代码
import { readdir } from "node:fs/promises"; import concurrently from "concurrently"; async function runAllScripts() { // 读取packages目录并过滤出子目录 const packageDirs = await readdir("./packages", { withFileTypes: true }); const validPackageDirs = packageDirs .filter(dirent => dirent.isDirectory()) .map(dirent => dirent.name); const commands = validPackageDirs.map((dirName) => ({ name: dirName, command: "npm run start", cwd: `./packages/${dirName}`, })); await concurrently( ["npm run build:watch", ...commands], { prefix: "{name}", killOthers: "failure", restartTries: 3, } ); } // 执行并捕获全局错误 runAllScripts().catch(err => { console.error("运行脚本出错:", err); process.exit(1); });
额外说明
- 过滤目录:用
withFileTypes: true和isDirectory()确保只处理packages下的子目录,避免误读文件。 - 错误处理:添加catch块捕获运行时错误,确保出错时能正常退出进程并给出提示。
- 灵活终止策略:
killOthers: "failure"设置为只有当某个命令失败时才终止其他进程,比killOthers: true更符合多数开发场景。
内容的提问来源于stack exchange,提问作者user26121356
相关产品推荐
相关产品推荐

