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

7

假设我们有一个带管道的NPM脚本,类似于Istanbul文档中建议的方式:

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

很明显它没有考虑到Windows。

如何在Node.js包中实现这样的带管道的跨平台命令?

这个问题特定于Coveralls,但不限于它;这可以是任何带管道的命令。


你能用Node编程实现这个吗?我知道对于一个简单的管道命令来说这有点大材小用,但至少可以保证跨平台兼容性。 - zero298
3个回答

3

无论是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);
});

正如您所看到的,它利用了节点内置:

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

npm脚本

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

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

注意: 上面的npm脚本假定cat.jspackage.json位于相同的目录和级别。如果您选择将其放在其他位置,则需要重新定义其路径。例如,"node path/to/cat ./coverage/lcov.info | ..."

只要管道符号(|)右侧指定的nodejs文件使用process.stdinstdin(文件描述符为0)读取数据(如coveralls.js所做的那样),使用跨平台管道就没问题。


如果可能的话,我尽量避免使用自定义脚本,因为这违背了使用NPM脚本的目的。如果有一个脚本,很容易就会把所有东西都移到它上面。感谢您提供的cat示例,我刚刚发现了https://github.com/shelljs/shx,我想`shx cat`将是一个可替换的选择。 - Estus Flask
是的,shx cat 是一个理想的替代品。有趣的是,我一段时间以前也发现它太诱人了,现在所有的自定义构建逻辑和工具都驻留在一个单独的 .js 脚本中——类似于 eslintpackage.jsonMakefile.js 中所做的。我在 .js 脚本中广泛使用 shelljs 方法来解决跨平台问题。仅仅使用 npm-script 已经变得过于晦涩难懂、缺乏注释、缺乏逻辑定制等等。 - RobC

1

关于

我们制作了一个专门针对此问题的软件包: 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"
}


1
虽然我有一段时间没有使用Windows了,但它的CMD.EXE命令行处理器支持命令重定向以及将一个程序的输出“管道”到另一个程序的输入。
有关更多信息,请参见语法重定向
要进行编程式管道操作,请参见pipe-operator NPM模块,该模块提供了Node/JavaScript实现的shell管道。

谢谢,我想这里的主要问题是 cat 命令,正如另一个回答中建议的那样。我猜想 Windows 的本地替代品看起来会非常不同,可能没有 | 这个符号。 - Estus Flask
在Windows下,可以使用“type PATH”将文件的内容传输到另一个程序。 - Rob Raisch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接