通过(全局)shell脚本启动节点时如何禁用警告

时间:2019-04-20 22:25:41

标签: node.js npm fs

我正在构建带有节点的CLI工具,并想使用fs.promise API。但是,在启动应用程序时,总会有一个ExperimentalWarning,这很烦人,并且会干扰交互提示。如何禁用此警告/所有警告?

我正在使用Windows 10上的最新节点v10 lts进行测试。

要全局使用CLI工具,我已将其添加到我的package.json文件中:

    { 
      //...
      "preferGlobal": true,
      "bin": { "myapp" : "./index.js" }
      //...
    }

并运行npm link来链接./index.js脚本。然后,我可以使用myapp来简单地在全球范围内运行该应用程序。

经过一些研究,我注意到通常有两种禁用警告的方法:

  1. 设置环境变量NODE_NO_WARNINGS=1
  2. 使用node --no-warnings ./index.js调用脚本

尽管我可以使用上述2种方法禁用警告,但是在直接运行myapp命令时似乎无法执行此操作。

我在入口脚本./index.js中放置的shebang是:

#!/usr/bin/env node


// my code...

我还阅读了其他有关修改shebang的讨论,但是还没有找到一种通用/跨平台的方法-将参数传递给node本身,或者设置env变量。

如果我发布此npm程序包,那么有一种方法可以确保提前禁用此单个程序包的警告,而不是让每个用户自己调整其环境,那将是很棒的。是否存在任何允许这样做的隐藏npm package.json配置?

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

这是我用来运行带有命令行标志的节点的内容:

#!/bin/sh
_=0// "exec" "/usr/bin/env" "node" "--experimental-repl-await" "$0" "$@"

// Your normal Javascript here

第一行告诉shell使用/ bin / sh运行脚本。第二行有点神奇。对于外壳程序,它是一个变量赋值_=0//,后跟"exec" ...

Node将其视为变量后跟注释,因此与为_分配0的副作用差不多。

结果是,当shell到达第2行时,它将使用所需的任何命令行选项(通过env)执行节点。

答案 1 :(得分:0)

我现在正在使用启动器脚本生成child_process来解决此限制。难看,但是它可以与npm link,全局安装和其他功能一起使用。

#!/usr/bin/env node
const { spawnSync } = require("child_process");
const { resolve } = require("path");

// Say our original entrance script is `app.js`
const cmd = "node --no-warnings " + resolve(__dirname, "app.js");
spawnSync(cmd, { stdio: "inherit", shell: true });

有点像hack,下次我将不再使用此方法,而是将原始API手动包装在promise中,坚持使用util.promisify,或使用阻止/同步版本的API。