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

问题描述 投票:7回答:5

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

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

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

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

node.js npm
5个回答
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');

14
投票

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

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


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。它有恢复错误的选项,将参数传递给所有脚本,并且可以跨平台工作。


Better Architecture

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

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

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

为了解决这些问题并仍然保持良好的版本控制和协调,我在每个项目上使用Lernanpm i -g lerna@prerelease)。它设置了一个带有packages/目录的monorepo,该目录包含你的每个项目npm包。执行lerna bootstrap然后lerna run start链接所有彼此依赖的包,然后在定义一个的所有包中运行你的npm启动脚本。 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和模块化软件包,您将摆脱这些类型的问题


0
投票

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

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

例如:“开发”:“启动咖啡 - 手表 - 编译js /&启动咖啡 - 手表 - 编辑控制器/&启动主管-e html,js js / index.js

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


0
投票

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

npm install --save-dev parallelshell

然后执行:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.