如何将一个 `npm run script.js` 的返回值作为参数传递给另一个 `npm run script2.js`?

4
有没有一种方法可以在不使用第三方组件的情况下,在package.json中的scripts中实现它?
1个回答

0

我不确定这是最好的解决方案,但我还没有想出更好的方法。由于我正在寻找一种适用于Windows控制台的方法,所以我只在那里检查了它,但我认为它也应该在Linux shell中工作。

因此,我们将有两个JavaScript文件:

  1. send-param.js:应该发送(返回)一个字符串参数
  2. read-param.js:应该将该字符串参数作为参数获取

这两个JS文件都应该从package.json的脚本中运行。技术本身非常简单:send-param.js将一个字符串值写入stdout,而read-param.js然后将其作为参数获取。主要问题是如何将stdout“转换”为read-param.js脚本的参数。

要将某些内容写入stdout,我们可以使用console.log,这正是send-param.js实际执行的操作:

console.log("Hello World!");

接下来,我们想要运行read-param.js从参数中获取"Hello World!"字符串,但在 Windows 控制台中直接执行似乎不可能。因此,我只能使用一个中间操作将该参数从stdout写入辅助文件(我只是将其命名为'1.txt'),这在脚本的第一部分中完成:

node send-param.js > 1.txt

现在,我们已经在'1.txt'文件中拥有了"Hello World!",并且必须以某种方式将其作为参数发送到read-param.js脚本中。同样,在Windows控制台中我找不到直接做法,只能使用一个变量,我称之为'ARG'

set /p ARG=<1.txt

最后,我们可以使用'ARG'变量作为我们的read-param.js脚本的参数:

"node read-param.js %ARG%"

我首先想到的是像这样执行所有命令的单行脚本:

"send-param.js > 1.txt && set /p ARG=<1.txt && node read-param.js %ARG%"

但是由于需要将set作为单独的命令运行,所以它不起作用(请看原因)。

read-param.js中,我们只是读取第一个参数作为process.argv[2](Node.js 保留前两个参数用于自身参数)。


这里是最终可用的示例

send-param.js:

console.log("Hello World!");

read-param.js:

const argument = process.argv[2];

if (!argument)
    console.log('An argument is required.');
else
    console.log(`Argument: '${argument}'`);

package.json:

"scripts": {
  "send": "node send-param.js > 1.txt && set /p ARG=<1.txt && npm run read",
  "read": "node read-param.js %ARG%",
}

现在运行npm run send命令,您将获得:参数:'Hello World!'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接