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.exe 和 PowerShell)有管道运算符(|
),所以这不应该成为跨平台兼容性的问题。
鉴于您的 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);
});
如您所见,它利用内置节点:
fs.readFile
读取文件内容。
- 要读取的文件的文件路径将作为参数提供给脚本并使用
process.argv
捕获。
- 文件内容被写入
process.stdout
注意:为了简洁起见cat.js
不包含任何错误capturing/handling,因此您不妨添加一些.
npm 脚本
然后在 package.json 的 scripts
部分,我们调用 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
命令完全相同。您可以从脚本中将其称为 cat
或 cross-cat
。它也适用于 windows cmd
和 coveralls
。
安装
npm install cross-cat --save-dev
使用
"scripts": {
"coveralls": "cross-cat coverage/lcov.info | coveralls"
}
考虑到我们有带管道的 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.exe 和 PowerShell)有管道运算符(|
),所以这不应该成为跨平台兼容性的问题。
鉴于您的 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);
});
如您所见,它利用内置节点:
fs.readFile
读取文件内容。- 要读取的文件的文件路径将作为参数提供给脚本并使用
process.argv
捕获。 - 文件内容被写入
process.stdout
注意:为了简洁起见cat.js
不包含任何错误capturing/handling,因此您不妨添加一些.
npm 脚本
然后在 package.json 的 scripts
部分,我们调用 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
命令完全相同。您可以从脚本中将其称为 cat
或 cross-cat
。它也适用于 windows cmd
和 coveralls
。
安装
npm install cross-cat --save-dev
使用
"scripts": {
"coveralls": "cross-cat coverage/lcov.info | coveralls"
}