【问题标题】:Silencing errors on failures for npm run-scriptnpm run-script 失败时的静默错误
【发布时间】:2014-11-08 05:16:32
【问题描述】:

当您运行 npm test 并失败时,您会得到测试输出 + 一条错误消息,如下所示:

npm ERR! Test failed.  See above for more details.

但是,我制作了一个名为 lint 的自定义脚本,如下所示:

// package.json
{
  // ...
  "scripts": {
    // ... definition for test ...
    "lint": "./node_modules/jsxhint/cli.js src/",
  }
}

好的,很简单。但是当你运行 npm run lint 并且它失败了,而不是 npm test 的漂亮错误,在 linter 的输出之后你会收到一条巨大的错误消息:

npm ERR! Darwin 14.0.0
npm ERR! argv "node" "/usr/local/bin/npm" "run-script" "lint"
npm ERR! node v0.10.32
npm ERR! npm  v2.1.7
npm ERR! code ELIFECYCLE
# and ~15 more lines...

有没有办法让所有这些垃圾静音,这样我就可以像npm test 脚本一样获得干净的输出?我看到他们是如何在npm 源代码中发现错误的,但我认为我不能只添加自定义命令而不像那样分叉npm...希望我错了!

但如果我是,我最好将这样的任务推到像 Grunt 这样的工具上吗?谢谢!

【问题讨论】:

标签: node.js npm


【解决方案1】:

使用 npm run --silent 选项:

$ npm run --silent test

如果你定义了一个 shell 别名,打字就更少了:

$ alias run='npm run --silent'
$ run test

【讨论】:

  • npm run -s test
  • 不适用于 OP 的用例。他们想在命令行上运行npm run lint,并在 package.json 的脚本条目中指定 lint 脚本不应该打印无用的消息。例如,人们希望 ` "scripts":{ "tslint": "tslint", "lint": "npm run --silent tslint src/**/*.ts" }` 可能有效。但不是。无用的嘈杂信息吐了出来。
【解决方案2】:

如果您不关心保留 linter 进程的返回码,您始终可以像这样配置您的 package.json

{
  // ...
  "scripts": {
    // ...
    "lint": "eslint . || true",
  }
}

【讨论】:

  • 如果您希望它也可以在 Windows 上运行,也可以安装 cash-true
【解决方案3】:

我一直在想办法解决这个问题。这不是一个完美的答案,但它可以像这样将 linting 指定为预测试脚本 (docs):

// package.json
{
  // ...
  "scripts": {
    // ... definition for test ...
    "pretest": "./node_modules/jsxhint/cli.js src/",
  }
}

那么,当你第一次输入npm test时,你只会从NPM得到一个单行错误。显然,这意味着如果您没有 linted,您将无法运行测试。

另一种选择是使用某种第三方任务运行器,例如 Make、GruntGulp

我只使用过 Make,我认为它是最轻松的设置(至少在 OSX 和 Linux 上,不确定 Windows)。

在您的根目录中创建一个Makefile,如下所示:

lint:
    ./node_modules/.bin/jslint ./*.js # or whatever your lint command is

test:
    ./node_modules/.bin/mocha test/*.js # or whatever your test command is

.PHONY: lint test

然后输入make testmake lint 来运行这些命令。

【讨论】:

  • 是的,现在我一直在使用 gulp 和 grunt,虽然它为 CLI 运行程序添加了一个额外的安装步骤,并为记住我想要精简的另一个命令而工作正常。没什么大不了的,但我会留下这个问题,看看是否有人提出了什么问题(并检查 npm 上是否存在问题:-))
【解决方案4】:

您可以通过 redirecting the stderr 将错误静音到 /dev/null。例如:

{
 "test": "karma start" (package.json)
}

运行:

$ npm run test 2> /dev/null

现在会将所有 npm 错误发送到 /dev/null,但在控制台中仍然可以看到正常输入。

因为错误是npm抛出的,所以在karma以非零状态退出后,做以下是不够的:

 {
     "test": "karma start 2> /dev/null"
 }

但您可以通过创建另一个使用 stderr 重定向调用该任务的任务来克服它:

 {
     "test": "karma start",
     "test:silent": "npm run test 2> /dev/null" 
 }

这将确保 npm 错误消息被隐藏

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-10
    • 2022-11-29
    • 2019-04-09
    • 2020-12-31
    • 2020-09-06
    • 2021-04-30
    • 2021-08-12
    相关资源
    最近更新 更多