在我的package.json
我有这两个脚本:
"scripts": {
"start-watch": "nodemon run-babel index.js",
"wp-server": "webpack-dev-server",
}
每次我开始在Node.js中开发时,我必须同时运行这两个并行的脚本。我想到的第一件事就是添加第三个这样的脚本:
"dev": "npm run start-watch && npm run wp-server"
...但是等待start-watch
完成后才能运行wp-server
。
如何并行运行这些?请记住,我需要查看这些命令的output
。此外,如果您的解决方案涉及构建工具,我宁愿使用gulp
而不是grunt
,因为我已经在另一个项目中使用它。
答案 0 :(得分:467)
使用名为concurrently的包。
SELECT DISTINCT(productid)
FROM q_products as oc,
q_product_apply_access as ocaa,
q_product_aff_access as ocfa
WHERE productid IN (productidList)
AND (
(oc.productid=ocaa.productid
AND ocaa.affiliateid='partnerid'
AND ocaa.apply_status=0)
OR
(oc.productid=ocfa.productid
AND ocfa.accid='accountid')
)
and status=0
AND visibility IN (1,2,3)
然后设置npm i concurrently --save-dev
任务:
npm run dev
答案 1 :(得分:297)
使用Concurrently包工作,但您不需要它来完成此任务。您可以在基于UNIX的计算机上使用管道来运行并发任务。我建议使用这种方法,因为它可以使您不必添加额外的依赖项。
"dev": "npm run start-watch > /dev/null | npm run wp-server"
注意:第一个命令将忽略其输出
答案 2 :(得分:90)
如果你正在使用类似UNIX的环境,只需使用&
作为分隔符:
"dev": "npm run start-watch & npm run wp-server"
否则,如果您对跨平台解决方案感兴趣,可以使用npm-run-all模块:
"dev": "npm-run-all --parallel start-watch wp-server"
答案 3 :(得分:57)
从Windows cmd,您可以使用start
:
"dev": "start npm run start-watch && start npm run wp-server"
以这种方式启动的每个命令都从它自己的窗口开始。
答案 4 :(得分:46)
您应该使用npm-run-all(或concurrently
,parallelshell
),因为它可以更好地控制启动和终止命令。运算符&
,|
是不好的主意,因为您需要在完成所有测试后手动停止它。
这是通过npm进行量角器测试的一个例子:
scripts: {
"webdriver-start": "./node_modules/protractor/bin/webdriver-manager update && ./node_modules/protractor/bin/webdriver-manager start",
"protractor": "./node_modules/protractor/bin/protractor ./tests/protractor.conf.js",
"http-server": "./node_modules/http-server/bin/http-server -a localhost -p 8000",
"test": "npm-run-all -p -r webdriver-start http-server protractor"
}
-p
=并行运行命令。
-r
=当其中一个命令以退出代码零结束时,终止所有命令。
运行npm run test
将启动Selenium驱动程序,启动http服务器(为您提供文件)并运行量角器测试。完成所有测试后,它将关闭http服务器和selenium驱动程序。
答案 5 :(得分:16)
更好的解决方案是使用size
&
答案 6 :(得分:11)
如果用单个&符号替换双号&符号,脚本将同时运行。
答案 7 :(得分:10)
我已经检查了上面的几乎所有解决方案,只有npm-run-all才能解决所有问题。与所有其他解决方案相比的主要优势是能够run script with arguments。
{
"test:static-server": "cross-env NODE_ENV=test node server/testsServer.js",
"test:jest": "cross-env NODE_ENV=test jest",
"test": "run-p test:static-server \"test:jest -- {*}\" --",
"test:coverage": "npm run test -- --coverage",
"test:watch": "npm run test -- --watchAll",
}
注意
的快捷方式run-p
是npm-run-all --paraller
这允许我使用npm run test:watch -- Something
等参数运行命令。
修改强>
npm-run-all
还有一个有用的option:
-r, --race - - - - - - - Set the flag to kill all tasks when a task
finished with zero. This option is valid only
with 'parallel' option.
将-r
添加到npm-run-all
脚本,以便在完成代码0
时终止所有进程。当您运行HTTP服务器和使用该服务器的另一个脚本时,这尤其有用。
"test": "run-p -r test:static-server \"test:jest -- {*}\" --",
答案 8 :(得分:9)
我有一个跨平台解决方案,没有任何额外的模块。我正在寻找类似try catch块的东西,我可以在cmd.exe和bash中使用它们。
解决方案是command1 || command2
,它似乎在两个环境中都有效。所以OP的解决方案是:
"scripts": {
"start-watch": "nodemon run-babel index.js",
"wp-server": "webpack-dev-server",
// first command is for the cmd.exe, second one is for the bash
"dev": "(start npm run start-watch && start npm run wp-server) || (npm run start-watch & npm run wp-server)",
"start": "npm run dev"
}
然后简单的npm start
(和npm run dev
)将适用于所有平台!
答案 9 :(得分:6)
在这种情况下,我会说最好的选择 如果此脚本是针对仅在基于* nix的计算机上运行的私有模块,则可以使用分叉过程的控制操作符,如下所示:&
在部分package.json文件中执行此操作的示例:
{
"name": "npm-scripts-forking-example",
"scripts": {
"bundle": "watchify -vd -p browserify-hmr index.js -o bundle.js",
"serve": "http-server -c 1 -a localhost",
"serve-bundle": "npm run bundle & npm run serve &"
}
然后您可以通过npm run serve-bundle
并行执行它们。您可以增强脚本以将分叉进程的pid输出到如下文件:
"serve-bundle": "npm run bundle & echo \"$!\" > build/bundle.pid && npm run serve & echo \"$!\" > build/serve.pid && npm run open-browser",
谷歌类似 bash控制运算符forforking 以了解有关其工作原理的更多信息。我还提供了一些关于在以下Node项目中利用Unix技术的进一步背景:
如果您不在Windows上,Unix工具/技术通常可以很好地实现Node脚本,因为:
Nodeland中用于系统任务的模块通常也是Unix工具的抽象或近似,从fs
到streams
。
答案 10 :(得分:4)
npm install npm-run-all --save-dev
package.json:
"scripts": {
"start-watch": "...",
"wp-server": "...",
"dev": "npm-run-all --parallel start-watch wp-server"
}
更多信息:https://github.com/mysticatea/npm-run-all/blob/master/docs/npm-run-all.md
答案 11 :(得分:3)
运行多个Node脚本的另一个选项是使用单个Node脚本,可以 fork 许多其他脚本。在Node中本地支持分叉,因此它不添加依赖关系并且是跨平台的。
这样就可以按原样运行脚本,并假设它们位于父脚本的目录中。
// fork-minimal.js - run with: node fork-minimal.js
const childProcess = require('child_process');
let scripts = ['some-script.js', 'some-other-script.js'];
scripts.forEach(script => childProcess.fork(script));
这将使用参数运行脚本,并由许多可用选项配置。
// fork-verbose.js - run with: node fork-verbose.js
const childProcess = require('child_process');
let scripts = [
{
path: 'some-script.js',
args: ['-some_arg', '/some_other_arg'],
options: {cwd: './', env: {NODE_ENV: 'development'}}
},
{
path: 'some-other-script.js',
args: ['-another_arg', '/yet_other_arg'],
options: {cwd: '/some/where/else', env: {NODE_ENV: 'development'}}
}
];
let processes = [];
scripts.forEach(script => {
let runningScript = childProcess.fork(script.path, script.args, script.options);
// Optionally attach event listeners to the script
runningScript.on('close', () => console.log('Time to die...'))
runningScripts.push(runningScript); // Keep a reference to the script for later use
});
分叉还有一个额外的好处,即父脚本可以从分叉子进程接收事件以及发回。一个常见的例子是父脚本杀死它的分叉子节点。
runningScripts.forEach(runningScript => runningScript.kill());
有关更多可用的事件和方法,请参阅ChildProcess
documentation
答案 12 :(得分:3)
这对我有用
{
"start-express": "tsc && nodemon dist/server/server.js",
"start-react": "react-scripts start",
"start-both": "npm -p -r run start-react && -p -r npm run start-express"
}
客户端和服务器都是用打字稿编写的。
React应用是使用带有typescript模板的create-react-app创建的,并且位于默认的src目录中。
Express位于服务器目录中,入口文件为server.js
打字稿代码,并转换为js,并放在dist目录中。
检出我的项目以获取更多信息:https://github.com/nickjohngray/staticbackeditor
更新: 打电话给npm run dev,开始做事
{"server": "tsc-watch --onSuccess \"node ./dist/server/index.js\"",
"start-server-dev": "npm run build-server-dev && node src/server/index.js",
"client": "webpack-dev-server --mode development --devtool inline-source-map --hot",
"dev": "concurrently \"npm run build-server-dev\" \"npm run server\" \"npm run client\""}
答案 13 :(得分:3)
答案 14 :(得分:3)
我遇到&
和|
的问题,分别退出状态和错误抛出。
其他解决方案希望运行具有给定名称的任何任务,例如npm-run-all,这不是我的用例。
所以我创建了npm-run-parallel,它以异步方式运行npm脚本,并在完成后报告。
因此,对于您的脚本,它是:
npm-run-parallel wp-server start-watch
答案 15 :(得分:2)
在父文件夹的package.json中:
"dev": "(cd api && start npm run start) & (cd ../client && start npm run start)"
在Windows中工作
答案 16 :(得分:2)
只需将此npm脚本添加到根文件夹中的package.json
文件中即可。
{
...
"scripts": {
...
"start": "react-scripts start", // or whatever else depends on your project
"dev": "(cd server && npm run start) & (cd ../client && npm run start)"
}
}
答案 17 :(得分:2)
...但是在运行wp-server之前,它将等待开始监视完成。
为此,您必须在命令上使用start
。其他人已经说明过了,但这就是它的工作方式,您的代码如下:
"dev": "npm run start-watch && npm run wp-server"
应该是:
"dev": " start npm run start-watch && start npm run wp-server"
这将要做的是,它将为每个命令打开一个单独的实例并同时处理它们,就您最初遇到的问题而言,这应该不是问题。 我为什么这么说?是因为这些实例在您只运行1条语句(这是您的最初目标)时都会自动打开。
答案 18 :(得分:1)
我已经使用npm-run-all已有一段时间了,但是由于它在监视模式下的命令输出不能很好地协同工作,所以我从不接受它。例如,如果我在监视模式下启动create-react-app
和jest
,则只能看到我运行的最后一条命令的输出。所以大多数时候,我都是手动运行所有命令...
这就是为什么我实现自己的库run-screen的原因。它仍然是一个非常年轻的项目(从昨天开始:p),但是看一下它可能会更糟,在您的情况下,它将是:
run-screen "npm run start-watch" "npm run wp-server"
然后按数字键1
查看wp-server
的输出,然后按0
查看start-watch
的输出。
答案 19 :(得分:1)
我的解决方案类似于Piittis,尽管使用Windows时遇到了一些问题。所以我必须验证win32。
const { spawn } = require("child_process");
function logData(data) {
console.info(`stdout: ${data}`);
}
function runProcess(target) {
let command = "npm";
if (process.platform === "win32") {
command = "npm.cmd"; // I shit you not
}
const myProcess = spawn(command, ["run", target]); // npm run server
myProcess.stdout.on("data", logData);
myProcess.stderr.on("data", logData);
}
(() => {
runProcess("server"); // package json script
runProcess("client");
})();
答案 20 :(得分:0)
使用 npm 运行多个并行脚本的分步指南。 全局安装 npm-run-all 包
npm i -g npm-run-all
现在在您的 package.json 所在的项目中安装并保存这个包
npm i npm-run-all --save-dev
现在以这种方式修改 package.json 文件中的脚本
"scripts": {
"server": "live-server index.html",
"watch": "node-sass scss/style.scss --watch",
"all": "npm-run-all --parallel server watch"
},
现在运行这个命令
npm run all
在给定链接中有关此包的更多详细信息 npm-run-all
答案 21 :(得分:0)
您还可以使用 pre
和 post
作为特定脚本的前缀。
"scripts": {
"predev": "nodemon run-babel index.js &",
"dev": "webpack-dev-server"
}
然后运行:
npm run dev
答案 22 :(得分:0)
简单的节点脚本,无需太多麻烦即可开始工作。使用readline合并输出,这样行就不会混乱。
const { spawn } = require('child_process');
const readline = require('readline');
[
spawn('npm', ['run', 'start-watch']),
spawn('npm', ['run', 'wp-server'])
].forEach(child => {
readline.createInterface({
input: child.stdout
}).on('line', console.log);
readline.createInterface({
input: child.stderr,
}).on('line', console.log);
});
答案 23 :(得分:0)
在我的情况下,我有两个项目,一个是用户界面,另一个是 API ,两个项目在各自的package.json
文件中都有自己的脚本。
所以,这就是我所做的。
npm run --prefix react start& npm run --prefix express start&