我正在构建带有节点的CLI工具,并想使用fs.promise
API。但是,在启动应用程序时,总会有一个ExperimentalWarning
,这很烦人,并且会干扰交互提示。如何禁用此警告/所有警告?
我正在使用Windows 10上的最新节点v10 lts进行测试。
要全局使用CLI工具,我已将其添加到我的package.json
文件中:
{
//...
"preferGlobal": true,
"bin": { "myapp" : "./index.js" }
//...
}
并运行npm link
来链接./index.js
脚本。然后,我可以使用myapp
来简单地在全球范围内运行该应用程序。
经过一些研究,我注意到通常有两种禁用警告的方法:
NODE_NO_WARNINGS=1
node --no-warnings ./index.js
调用脚本尽管我可以使用上述2种方法禁用警告,但是在直接运行myapp
命令时似乎无法执行此操作。
我在入口脚本./index.js
中放置的shebang是:
#!/usr/bin/env node
// my code...
我还阅读了其他有关修改shebang的讨论,但是还没有找到一种通用/跨平台的方法-将参数传递给node本身,或者设置env变量。
如果我发布此npm程序包,那么有一种方法可以确保提前禁用此单个程序包的警告,而不是让每个用户自己调整其环境,那将是很棒的。是否存在任何允许这样做的隐藏npm package.json
配置?
任何帮助将不胜感激!
答案 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。