在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变成一场灾难。
为了解决这些问题,仍然保持良好的版本和协调,我在每个项目上都使用了Lerna ( npm 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个脚本( start
, test
, build
)和第4 eject
脚本,其唯一用途是将基础模块化构build系统呕吐到您的项目目录中。 它的速度非常快,热量大,但是你有更less的select(常见的误解) 。 实际上,你的状态要好得多,不会退缩,而且从一个永不失败的构build系统中受益,这个系统将得到稳固的升级。 在各个模块之间横向扩展您的系统,而不是在所有方向上呈指数级增长 。
为了将这个devise应用到许多没有被create-react-app
(一件好事)覆盖的构build系统中,我创build了noderaider / modular lerna repo。 它与create-react-app
基本相同,但是面向CLIER / API模块创build包,可以与Lerna
和create-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个进程; 如果一个人死亡,他们都死了,不像使用&
。