顺序运行脚本,这些脚本正在监视更改



我有一个包。Json文件,如下所示,带有scripts标签。

{
"name": "name",
"version": "1.0.1",
"license": "MIT",
"scripts": {
"cmd1": "cd packages/apis/ && yarn start",
"cmd2": "cd packages/utils/ && yarn start",
"cmd3": "cd packages/components/ && yarn start",
"cmd4": "cd services/ad/ && yarn dev",
"start": "yarn cmd1 && yarn cmd2 && yarn cmd3 && yarn cmd4"
},
"dependencies": {
// dependencies listed here
}
}

上面的命令按顺序运行每个命令,但发生的情况是,它在执行下一个命令之前等待前一个命令完成执行。但问题是,上面的每个命令都在监视不同的服务,以查看文件中的更改,然后相应地编译它们。因此,这意味着上面的start命令只运行第一个命令,即cmd1并监视它,而不运行其余的命令。

我尝试使用concurrently包,但它并行运行所有命令。我也看了npm-run-all包,但它似乎有一个问题,当试图停止进程与ctrl + c键组合,因为它不停止进程,所以我必须关闭终端。

是否有其他方法可以使它们在观看所有命令的同时顺序运行?

您可以编写自己的Node.js脚本来完成此操作。也许检查第一个命令是否发出你正在寻找的字符串(例如"服务器启动于http://localhost:8000/"),然后执行下一个命令。

编辑:

也许这是有帮助的:

#!/usr/bin/env node
/**
* Usage:
*  ./runMany.js --command COMMAND1 [AWAITED_OUTPUT_REGEX1] [--command COMMAND2 ...] ...
*/
const { exec } = require('child_process');
const args = process.argv.slice(2);
async function main() {
/** @type {{ command: string; awaitedOutput?: RegExp }[]} */
const commands = [];
for (let i = 0; i < args.length; i++) {
const el = args[i];
if (el === '--command') {
++i;
const command = args[i + 1] || '';
const awaitedOutput =
args[i + 2] === undefined || args[i + 2] === '--command'
? undefined
: (++i, new RegExp(args[i + 2]));
commands.push({ command, awaitedOutput });
}
}
console.table(commands);
let i = 0;
for (const command of commands) {
console.info(`Executing: command ${i}`);
await execute(command);
console.info(`Done: command ${i++}`);
}
}
main();
/** @type {(options: {command: string, awaitedOutput?: RegExp}) => Promise<void>} */
function execute({ command, awaitedOutput }) {
const child = exec(command);
return new Promise((resolve) => {
awaitedOutput ? console.info(`Waiting for output that matches: ${awaitedOutput}`) : resolve();
child.stdout.on('data', (data) => {
const output = data.toString();
if (awaitedOutput?.test(output)) {
resolve();
}
process.stdout.write(output);
});
child.stderr.on('data', (data) => {
const output = data.toString();
process.stderr.write(output);
});
child.on('exit', (code) => {
// if there was an error, exit
if (code) {
process.exit(code);
}
resolve();
});
});
}

粘贴到runMany.js,然后用作:

node runMany.js --command 'yarn cmd1' 'THE OUTPUT YOU ARE WAITING FOR FROM cmd1' --command 'yarn cmd2' 'THE OUTPUT YOU ARE WAITING FOR FROM cmd2' --command 'yarn cmd3' 'THE OUTPUT YOU ARE WAITING FOR FROM cmd3' --command 'yarn cmd4' 'THE OUTPUT YOU ARE WAITING FOR FROM cmd4'

您只需要将start命令更改为:

"start": "yarn cmd1 && yarn cmd2 && yarn cmd3 && yarn cmd4"

"start": "yarn cmd1 & yarn cmd2 & yarn cmd3 & yarn cmd4 &"

这应该运行命令而不等待前一个命令完成。

可以通过命令"jobs&quot找到正在运行的作业。可以使用命令"fg"如果你需要在它完成之前一个接一个地杀死它们。

希望一切顺利。

包npm-run-all似乎有你正在寻找的东西。Npm-run-all带有——parallel标志

npm-run-all --parallel cmd1 cmd2 cmd3

文档说,如果一个命令是单一的CTRL+ c,则所有正在运行的并行命令都将被杀死。

请参考以下链接来设置每个"纱线">

https://github.com/mysticatea/npm-run-all/blob/HEAD/docs/npm-run-all.md npm-scripts

参见"nohup"命令,如果您需要返回终端而不等待命令完成。