You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过编程方式使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:36:10