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

我试图在package.json中设置一个脚本,为Coffeescript / Sass /等运行我所有的手表。

这是我在我的服务器上使用的脚本,工作正常。

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

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

对于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'); 

我为了这个目的而同时开发。 例如cat a & cat b可以通过concurrent 'cat a' 'cat b' 。 同时还提供了一些输出格式化选项,以方便使用。

安装它作为开发依赖npm install --save-dev concurrently ,然后准备在package.json“脚本”中使用。

npm-run-all从我所看到的是这样做的最stream行的包。 它将脚本run-s (sequential)和run-p (parallel)添加到项目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 ,你可以使用: run-p build build:dist 。 它具有错误恢复,将parameter passing给所有脚本的选项,并且跨平台运行良好。


更好的build筑

最近,我一直把我的项目分成微型模块。 只要我开始面对你遇到的问题,这是一个迹象表明,我的项目是太大了。 大型项目对于每个发布版本都能够find所有内容并保留一个版本很有帮助,但却导致构build和部署头痛。 有了大的回购,你必须为以下types的事情编排单独的版本:

  • sass / postcss打包
  • 节点库/实用程序文件(Babel)
  • 客户端应用程序包(Rollup / Webpack)
  • 可执行/部署
  • CI(unit testing/代码覆盖率)
  • 文件
  • 乘以〜2开发/生产版本。
  • 跨平台再乘以〜2。 (祝NODE_ENV好运)

它会把你的package.json变成一场灾难。

为了解决这些问题,仍然保持良好的版本和协调,我在每个项目上都使用了Lernanpm i -g lerna@prerelease )。 它build立了一个monorepo,其中包含一个packages/目录,其中包含您的每个项目npm包。 执行lerna bootstrap然后lerna run start链接所有相互依赖的包,然后在定义了一个的所有包中运行npm start脚本。 lerna run命令默认是并行执行的,但可以使用--concurrency=1顺序运行。 我发现没有项目太小,不能使用lerna,这使得小项目不那么麻烦。


create-react-app是将生态系统转移到模块化devise的项目的一个很好的例子。 它有最基本的要素,3个脚本( starttestbuild )和第4 eject脚本,其唯一用途是将基础模块化构build系统呕吐到您的项目目录中。 它的速度非常快,热量大,但是你有更less的select(常见的误解) 。 实际上,你的状态要好得多,不会退缩,而且从一个永不失败的构build系统中受益,这个系统将得到稳固的升级。 在各个模块之间横向扩展您的系统,而不是在所有方向上呈指数级增长

为了将这个devise应用到许多没有被create-react-app (一件好事)覆盖的构build系统中,我创build了noderaider / modular lerna repo。 它与create-react-app基本相同,但是面向CLIER / API模块创build包,可以与Lernacreate-react-app上游很好地配合使用。 我正在按照惯例create-<target>-module发布nightlies。 每个包都可以从CLI,package.json脚本运行,或者通过节点API编排。 如果在path中find,则使用纱线进行安装,否则返回到npm 。 它有当前webpack 2的工作脚手架,汇总,postcss和CLI包,以及unit testing和代码覆盖。 我目前正在研究模块化脚本,与lerna / create-react-app进一步凝聚力,并完成路线图上的其余模块。 拉/function请求欢迎。 期待每个软件包迅速吐出一个build筑物,可testing,可发布的软件包与travis-ci集成和快速变化之前1.0.0每semver 。

TL; DR使用Lerna和模块化软件包,你将会摆脱这些types的问题

mscdex的答案的问题是没有简单的方法来杀死这些后台任务启动后。 你必须去任务pipe理器,并杀死他们。

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

例如:“dev”:“开始咖啡 – 手表 – 编译js /&开始咖啡 – 手表 – 编译控制器/&开始监督-e html,js js / index.js

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

还有一个叫做parallelshell的好节点包。 安装它:

npm install --save-dev parallelshell

然后执行:

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

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