【问题标题】:Cross-platform pipe command in NPM scriptNPM 脚本中的跨平台管道命令
【发布时间】:2019-02-21 14:08:50
【问题描述】:

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

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

显然没有考虑到 Windows。

如何在 Node.js 包中使这种带有管道的命令跨平台?

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

【问题讨论】:

  • 你能用节点编程吗?我知道这对于一个简单的管道命令来说太过分了,但它至少可以保证跨平台兼容性。

标签: node.js npm pipe npm-scripts coveralls


【解决方案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"
}

【讨论】:

    【解决方案2】:

    Bash 和 Windows 命令行(例如 cmd.exePowerShell)都有管道运算符 (|),因此不必担心跨平台兼容性。

    鉴于您的示例 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,(如@ 987654326@确实)使用管道跨平台就可以了。

    【讨论】:

    • 我尽量避免使用自定义脚本,因为它们违背了使用 NPM 脚本的目的。如果有脚本,很容易将所有内容移至其中。感谢 cat 的例子,我刚刚发现 github.com/shelljs/shx ,我想 shx cat 将被替换。
    • 是的shx cat 是一个理想的替代品。有趣的是,不久前我发现它太诱人了,现在所有自定义构建逻辑和工具都驻留在单独的 .js 脚本中 - 类似于 eslintpackage.jsonMakefile.js。我在 .js 脚本中广泛使用shelljs 方法来解决跨平台问题。 npm-script's 本身就变得过于神秘、非人类可读、缺乏评论、缺乏逻辑定制等......
    【解决方案3】:

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

    更多信息请参见Syntax Redirection

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

    【讨论】:

    • 谢谢,我想这里的主要问题是cat,正如另一个答案中所建议的那样。我想 Windows 本机对应物看起来会非常不同,可能没有|
    • 在 Windows 下,type PATH 可用于将文件的内容通过管道传输到另一个程序。
    猜你喜欢
    • 2016-01-03
    • 2018-06-15
    • 2016-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-06
    • 2017-05-23
    • 1970-01-01
    相关资源
    最近更新 更多