NPM 脚本中的跨平台管道命令

Cross-platform pipe command in NPM script

考虑到我们有带管道的 NPM 脚本,类似于 Istanbul documentation 中的建议:

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

显然没有考虑Windows。

如何在 Node.js 包中跨平台使用管道命令?

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

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

有关详细信息,请参阅 Syntax Redirection

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

Bash 和 Windows 命令行(例如 cmd.exePowerShell)有管道运算符(|),所以这不应该成为跨平台兼容性的问题。

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

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

cat.js

const fs = require('fs');

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

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

注意:为了简洁起见cat.js不包含任何错误capturing/handling,因此您不妨添加一些.

npm 脚本

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

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

注意: 上面的 npm-script 假定 cat.js[=96= 位于同一目录和级别]。如果您选择将它放在别处,则需要重新定义它的路径。例如。 "node path/to/cat ./coverage/lcov.info | ..."

只要管道右边指定的nodejs文件(|)利用process.stdin to read from stdin, i.e file descriptor 0, (as coveralls.js就行)使用管道跨平台会好的。

关于

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

跨平台cat 命令,与linux cat 命令完全相同。您可以从脚本中将其称为 catcross-cat。它也适用于 windows cmdcoveralls

安装

npm install cross-cat --save-dev

使用

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