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

Jor*_*ren 7 node.js npm

我正在尝试在package.json中设置一个脚本,它运行Coffeescript/Sass /等各种各样的手表.

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

"dev": "coffee --watch --compile js/ & coffee --watch --compile controllers/ & supervisor -e html,js js/index.js",
Run Code Online (Sandbox Code Playgroud)

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

Kim*_*mmo 15

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

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

  • 2016年10月更新:在package.json中使用,请注意以下命令中的转义引号:“” start“:”同时\“ cat a \” \“ cat b \”“` (2认同)

cch*_*ain 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"
}
Run Code Online (Sandbox Code Playgroud)

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


更好的架构

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

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

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

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


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

为了将这种设计应用于许多未被create-react-app(好东西)覆盖的构建系统,我创建了noderaider/modular lerna repo.它的工作原理基本相同create-react-app,但其目标是CLI/API模块创建包,它们可以很好地与Lerna上游一起工作create-react-app.我根据公约发布了夜莺create-<target>-module.这些包中的每一个都可以从CLI,package.json脚本运行,或通过其节点API进行编排.如果在路径中找到它,则使用纱线进行安装,npm否则返回.它具有Webpack 2,汇总,postcss和CLI包的当前工作支架,以及单元测试和代码覆盖.我目前正致力于模块化脚本,与lerna/的进一步凝聚create-react-app,以及完成路线图中的其余模块.欢迎拉/特色要求.期望每个包装都能快速地为您提供一个建筑,可测试,可发布的包装,其中包括travis-ci集成和1.0.0每个semver之前的快速更改.

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


msc*_*dex 4

对于 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');
Run Code Online (Sandbox Code Playgroud)