假设我们有一个带管道的NPM脚本,类似于Istanbul文档中建议的方式:
"coveralls": "cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls"
很明显它没有考虑到Windows。
如何在Node.js包中实现这样的带管道的跨平台命令?
这个问题特定于Coveralls,但不限于它;这可以是任何带管道的命令。
假设我们有一个带管道的NPM脚本,类似于Istanbul文档中建议的方式:
"coveralls": "cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls"
很明显它没有考虑到Windows。
如何在Node.js包中实现这样的带管道的跨平台命令?
这个问题特定于Coveralls,但不限于它;这可以是任何带管道的命令。
无论是Bash还是Windows命令行(例如 cmd.exe 和 PowerShell ),都具有管道运算符( |
),因此这不应该成为跨平台兼容性的问题。
考虑到您的示例npm-script,有关跨平台支持的主要不兼容性是使用Bash的cat
命令。在Windows cmd.exe中使用cat
将失败,但是通过Windows PowerShell支持cat
。
为了绕过上述关于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
没有包含任何错误捕获/处理,因此您可能希望添加一些。
npm脚本
然后在您的package.json的scripts
部分中,我们调用cat.js
并将文件路径(即./coverage/lcov.info
)作为参数传递。例如:
"scripts": {
"coveralls": "node cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls"
},
注意: 上面的npm脚本假定cat.js
与package.json位于相同的目录和级别。如果您选择将其放在其他位置,则需要重新定义其路径。例如,"node path/to/cat ./coverage/lcov.info | ..."
只要管道符号(|
)右侧指定的nodejs文件使用process.stdin
从stdin
(文件描述符为0
)读取数据(如coveralls.js所做的那样),使用跨平台管道就没问题。
cat
示例,我刚刚发现了https://github.com/shelljs/shx,我想`shx cat`将是一个可替换的选择。 - Estus Flaskshx cat
是一个理想的替代品。有趣的是,我一段时间以前也发现它太诱人了,现在所有的自定义构建逻辑和工具都驻留在一个单独的 .js 脚本中——类似于 eslint 在 package.json 和 Makefile.js 中所做的。我在 .js 脚本中广泛使用 shelljs 方法来解决跨平台问题。仅仅使用 npm-script 已经变得过于晦涩难懂、缺乏注释、缺乏逻辑定制等等。 - RobC我们制作了一个专门针对此问题的软件包: 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"
}
cat
命令,正如另一个回答中建议的那样。我猜想 Windows 的本地替代品看起来会非常不同,可能没有 |
这个符号。 - Estus Flask