【问题标题】:Query npm error state in bat file在bat文件中查询npm错误状态
【发布时间】:2014-01-19 21:10:11
【问题描述】:

我们目前正在将 UI 项目(总共 3 个)的构建转移到 Grunt。为了简化过渡,我想提供一个 bat 文件,该文件将为每个项目运行 npm install,但是我想知道在发出此命令时是否出现问题。这只是我追求的糖衣,我知道 npm 会回显错误,但我想为我的团队中不熟悉 npmnode 的成员提供一些更简单的消息。

有没有办法检查 npm 是否遇到错误并随后停止 bat 文件? 例如,如果未安装节点,我只需检查 %ERRORLEVEL% 是否为 1 . 如果是这种情况,我会回显一些指令并退出执行。我遇到的问题是,npm install 期间发生错误时,%ERRORLEVEL% 未设置为 1。

任何帮助表示赞赏!

【问题讨论】:

  • 通常 %ERRORLEVEL% 设置为最后执行命令的返回码。因此,在您的情况下,它将设置为“npm install”结果代码(不一定是 1)。
  • 错误的 npm 安装返回的错误级别为 0。与成功安装没有区别。

标签: node.js batch-file npm


【解决方案1】:

试试这个方法。

在我运行 npm 的批处理文件中(我们称之为 test.bat)我有这个:

@ECHO OFF
call npm install jquery 2<&1 || exit /b 1
ECHO Continuing...

现在,当我运行 test.bat 时,我看到了:

jquery@2.1.3 node_modules\jquery
Continuing...

但是,如果我将“jquery”更改为 不存在 的包的名称(即模拟 npm 故障,正如你所说,它不会影响 %ERRORLEVEL%)我明白了这个:

npm ERR! Windows_NT 6.2.9200
npm ERR! argv "C:\\Program Files (x86)\\nodejs\\\\node.exe" "C:\\Program Files (x86)\\nodejs\\node_modules\\npm\\bin\\npm-cli.js" "install" "asdasdas"
npm ERR! node v0.10.33
npm ERR! npm  v2.3.0
npm ERR! code ETARGET

npm ERR! notarget No compatible version found: undefined@'*'
npm ERR! notarget No valid targets found.
npm ERR! notarget Perhaps not compatible with your version of node?
npm ERR! notarget This is most likely not a problem with npm itself.
npm ERR! notarget In most cases you or one of your dependencies are requesting
npm ERR! notarget a package version that doesn't exist.

npm ERR! Please include the following file with any support request:
npm ERR!     C:\Projects\XXXX\npm-debug.log

注意,“ECHO Continuing”行没有被执行。

2&lt;&amp;1”部分似乎采用 STDERR 输出并将其重定向到 STDOUT:http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/redirection.mspx?mfr=true

"...句柄2(即STDERR),从ipconfig命令到句柄1 (即STDOUT)……”

我从https://stackoverflow.com/a/10359327/68432得到这个解决方案

【讨论】:

  • 谢谢,我会看看你的解决方案!
【解决方案2】:

某些命令不会更新ERRORLEVEL。我不太确定如何安装 node.js,但我在使用 NSLOOKUP 命令时遇到了同样的问题。 NPM 似乎在它自己的实例中运行,这也许可以解释为什么它没有更新 ERRORLEVEL

我可以建议您使用简单的重定向将命令的输出写入某个日志文件,然后在该文件中搜索指示安装不成功的文本。假设您正在寻找“错误”一词出现的次数。批处理文件可能如下所示:

    cmd /c "npm install > install.log 2>&1"
    for /f %%a in ('type install.log ^| find /c /i "err"') do set err=%%a
    if "%err%" GTR "0" echo ERROR was encountered during installation

一步一步解释:

  • cmd /c "npm install &gt; install.log 2&gt;&amp;1"

    执行安装并将输出重定向到install.log。注意最后的2&gt;&amp;1。这是为了将错误输出和标准都保存到一个文件中。 cmd /c 的原因是关闭 npm 将创建的实例。没有它,我无法完成这项工作。

  • for /f %%a in ('type install.log ^| find /c /i "err"') do set err=%%a

    通过 install.log 并将变量 err 设置为包含 'err' 的行数。

  • if "%err%" GTR "0" echo ERROR was encountered during installation

    如果 err 大于 0,则 echo 自定义消息。

另一种方法是对你需要的 node.js 部分进行基本测试,比如执行一些npm 命令并检查它们的输出(类似于上面)。但是,我不是 node.js 方面的专家,在这一点上无法进一步指导您。

【讨论】:

  • 谢谢!我其实之前已经在另一个项目中使用过这种解决方案,但是忘记了!
  • 不用担心。乐于助人;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 2019-06-28
  • 2015-04-10
  • 2017-09-18
  • 1970-01-01
  • 2013-03-22
相关资源
最近更新 更多