考虑到我们有一个带有管道的 NPM 脚本,类似于伊斯坦布尔文档中的建议:
"coveralls": "cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls"
它显然没有考虑Windows。
如何在 Node.js 包中使这种带有管道的命令跨平台?
这个问题是针对工作服的,但不限于此;这可以是任何带有管道的命令。
Bash 和 Windows 命令行(例如cmd.exe和PowerShell)都有管道运算符 ( |
),因此不必担心跨平台兼容性。
鉴于您的示例 npm-script,关于跨平台支持的主要不兼容性是使用 Bashcat
命令。通过 Windows cmd.execat
将失败,但通过cat
Windows PowerShell支持。
为了规避上述关于 的跨平台问题cat
,请考虑使用nodejs实用程序脚本,如下所示。让我们命名文件cat.js
:
猫.js
const fs = require('fs');
fs.readFile(process.argv[2], function(err, data) {
process.stdout.write(data);
});
如您所见,它利用了内置节点:
fs.readFile
读取文件的内容。process.argv
.process.stdout
注意:为简洁起见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.stdin
stdin
0
虽然我有一段时间没有使用 Windows,但它的 CMD.EXE 命令行处理器支持命令重定向以及将一个程序的输出“管道”到另一个程序的输入。
有关详细信息,请参阅语法重定向。
对于以编程方式进行管道,请参阅pipe-operator NPM 模块,了解 shell 管道的 Node/JavaScript 实现。
我们为此制作了一个包: 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"
}