在Windows上使用npm运行并发命令?

时间:2014-09-11 02:00:28

标签: node.js npm

我正在尝试在package.json中设置一个脚本,该脚本运行Coffeescript / Sass / etc的所有各种手表。

这是我在服务器上使用的脚本,效果很好。

"dev": "coffee --watch --compile js/ & coffee --watch --compile controllers/ & supervisor -e html,js js/index.js",

但是当我在本地尝试相同的脚本时,它似乎只运行第一个命令。 Windows似乎不知道如何处理&amp ;.每个命令都可以单独运行,但它们不会全部一起执行。

5 个答案:

答案 0 :(得分:14)

我为此目的开发了concurrently。例如,可以使用cat a & cat b来实现concurrently 'cat a' 'cat b'。同时还提供了一些输出格式选项以方便使用。

将其安装为dev依赖项npm install --save-dev concurrently,然后就可以在package.json“scripts”中使用它。

答案 1 :(得分:5)

npm-run-all来自我所见过的最受欢迎的套餐。它将脚本run-s(顺序)和run-p(并行)添加到项目bin中,使它们可以从项目脚本部分使用。

对于以下package.json脚本:

"scripts": {
  "start": "npm run build -- --watch",
  "prebuild": "rimraf lib dist",
  "build:dist": "rollup -c --sourcemap inline --environment NODE_ENV:production",
  "build": "babel src -d lib --ignore __tests__,__mocks__",
  "preversion": "npm run build && npm run build:dist",
  "test": "jest"
}

如果您想使用npm-run-all修改preversion脚本,可以将其缩短为run-s build build:dist。如果您希望它们并行运行,而不是按顺序运行,则可以使用:run-p build build:dist。它具有恢复错误,将参数传递给所有脚本以及跨平台工作的选项。

更好的架构

最近,我将我的项目分成了微模块。一旦我开始面对你遇到的那种问题,这表明我的项目太大了。大型项目有利于能够找到所有内容并为每个版本保留单个版本,但会导致构建和部署问题。对于大型回购,您必须为以下类型的事物编排单独的构建:

  • sass / postcss bundling
  • 节点库/实用程序文件(Babel)
  • 客户端应用程序包(Rollup / Webpack)
  • 可执行/部署
  • CI(单元测试/代码覆盖率)
  • 文档
  • 将您的开发/生产版本乘以~2。
  • 再次乘以~2跨平台。 (祝你好运NODE_ENV

它会将你的package.json变成灾难。

要解决这些问题并仍然保持良好的版本控制和协调,我会在每个项目上使用 Lerna npm i -g lerna@prerelease)。它设置了一个带有packages/目录的monorepo,该目录包含你的每个项目npm包。执行lerna bootstrap然后lerna run start链接所有彼此依赖的包,然后在定义一个包的所有包中运行npm start脚本。 lerna run命令默认并行执行,但可以使用--concurrency=1顺序运行。我发现没有一个项目太小,无法保证使用lerna,它使小项目变得不那么繁琐。

create-react-app是将生态系统转变为模块化设计的项目的一个很好的例子。它有基本要素,3个脚本(starttestbuild)和第4个eject脚本,其唯一用途是将基础模块化构建系统呕吐到项目中目录。它非常快速和热量重新加载很好,但你没有选择(常见的误解)。你实际上处于更好的状态而不是弹出,并从一个永不失败的构建系统中受益,它将获得可靠的升级。在模块之间水平 ,而不是指数在所有方向上。

为了将此设计应用于create-react-app未涵盖的许多构建系统(一件好事),我创建了noderaider/modular lerna repo。它的工作原理基本上与create-react-app相同,但其目标是CLI / API模块创建包,它与Lernacreate-react-app的上游配合得很好。我根据公约create-<target>-module发布了夜莺。这些包中的每一个都可以从CLI,package.json脚本运行,或通过其节点API进行编排。如果在路径中找到,则使用yarn进行安装,否则返回npm。它拥有适用于webpack 2,汇总,postcss和CLI软件包的当前工作支架,以及单元测试和代码覆盖。我目前正在开发模块化脚本,与lerna / create-react-app进一步凝聚,并完成roadmap上的其余模块。欢迎拉/特色要求。期待每个软件包快速向您推出一个可构建的,可测试的,可发布的软件包,travis-ci集成并在1.0.0semver之前快速更改。

TL; DR 使用Lerna和模块化软件包,您将摆脱这些类型的问题

答案 2 :(得分:3)

对于Windows,相当于&的内置等效命令会在命令前加上start /B。因此,您可能只需将“dev”设置为使用内置child_process执行以下操作的小节点脚本:

var exec = require('child_process').exec;
var prefix = (process.platform === 'win32' ? 'start /B ' : '');

exec(prefix + 'coffee --watch --compile js/');
exec(prefix + 'coffee --watch --compile controllers/');
exec(prefix + 'supervisor -e html,js js/index.js');

答案 3 :(得分:0)

mscdex的答案问题在于,没有简单的方法可以在启动后终止这些后台任务。你必须去任务经理并杀死它们。

相反,运行两个任务的最简单方法就是让它打开两个命令窗口。

ex:“dev”:“start coffee --watch --compile js /&amp; start coffee --watch --compile controllers /&amp; start supervisor -e html,js js / index.js

如果您运行'npm run dev',那么您将为每个进程打开一个命令窗口,它们可以单独停止。你不需要/ b开关。我正在使用“开始”:“启动webpack --watch&amp; start reload -b”运行webpack并重新加载

答案 4 :(得分:0)

还有一个名为parallelshell的好节点包。安装时使用:

npm install --save-dev parallelshell

然后执行:

parallelshell "command 1" "command 2" "command 3"

这种方法的优点(来自上面的链接的更多细节)而不是command 1 & command 2 & command 3包括:它是跨平台的; ctrl-c结束所有3个进程;如果一个人死了,他们都会死,不像使用&