5

考虑到我们有一个带有管道的 NPM 脚本,类似于伊斯坦布尔文档中的建议:

"coveralls": "cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls"

它显然没有考虑Windows。

如何在 Node.js 包中使这种带有管道的命令跨平台?

这个问题是针对工作服的,但不限于此;这可以是任何带有管道的命令。

4

3 回答 3

3

Bash 和 Windows 命令行(例如cmd.exePowerShell)都有管道运算符 ( |),因此不必担心跨平台兼容性。

鉴于您的示例 npm-script,关于跨平台支持的主要不兼容性是使用 Bashcat命令。通过 Windows cmd.execat将失败,但通过catWindows PowerShell支持。

为了规避上述关于 的跨平台问题cat,请考虑使用nodejs实用程序脚本,如下所示。让我们命名文件cat.js

猫.js

const fs = require('fs');

fs.readFile(process.argv[2], function(err, data) {
  process.stdout.write(data);
});

如您所见,它利用了内置节点:

注意:为简洁起见cat.js,不包括任何错误捕获/处理,因此您可能希望添加一些。

npm 脚本

然后在您的package.jsonscripts部分中,我们调用并将文件的路径(即)作为参数传递。例如:cat.js./coverage/lcov.info

"scripts": {
  "coveralls": "node cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls"
},

注意:上面的 npm-script 假设与package.jsoncat.js位于同一目录和级别。如果您选择将其定位在其他地方,则需要重新定义它的路径。例如"node path/to/cat ./coverage/lcov.info | ..."

只要管道( )右侧指定的nodejs文件使用管道跨平台读取,即文件描述符,(如coveralls.js所做的那样)就可以了。|process.stdinstdin0

于 2018-09-18T14:03:20.323 回答
1

虽然我有一段时间没有使用 Windows,但它的 CMD.EXE 命令行处理器支持命令重定向以及将一个程序的输出“管道”到另一个程序的输入。

有关详细信息,请参阅语法重定向

对于以编程方式进行管道,请参阅pipe-operator NPM 模块,了解 shell 管道的 Node/JavaScript 实现。

于 2018-09-17T23:14:44.437 回答
1

关于

我们为此制作了一个包: https ://github.com/cpuabuse/cross-cat

一个跨平台的cat命令,行为与 linuxcat命令完全一样。您可以将其作为脚本调用,cat也可以cross-cat从脚本调用。cmd它也适用于 Windows coveralls

安装

npm install cross-cat --save-dev

采用

"scripts": {
    "coveralls": "cross-cat coverage/lcov.info | coveralls"
}

于 2020-03-22T03:25:36.977 回答