将节点检查器与 Grunt 任务一起使用

Posted

技术标签:

【中文标题】将节点检查器与 Grunt 任务一起使用【英文标题】:Using node-inspector with Grunt tasks 【发布时间】:2012-06-25 15:02:54 【问题描述】:

有人使用node-inspector 和Grunt 进行应用程序调试吗?如果没有,你能推荐一个基于 Grunt 的应用程序的调试工具吗?

我正在为服务器端应用程序使用 nodejs,并且我有 Grunt 使用单独的任务(这是因为用户可以单独执行任务)。

【问题讨论】:

console.log 是你的朋友。我很想访问 node-inspector,但我认为调试工具不是 V8 的一部分。据我了解,调试工具本身就是一个网络应用程序。如果我在这里错了,请纠正我,因为我想做你的尝试。 是的,日志系统(我的意思是 console.log 或其他类型的日志机制)将永远是我们的朋友,但我需要的是一种不同且更易于调试的方式。到目前为止,我发现 grunt 对我的项目有一些缺失的要求,所以我现在已经删除了,我使用 nodejs 作为它自己的,所以我现在可以使用 node-inspector 进行调试。我知道,这不是解决方案,但它有效。我想,在未来,我会再次添加 grunt 并添加节点检查器和其他工具/功能。最后但并非最不重要的一点是,咕噜声太棒了!我在其他项目中使用它,真的很棒! 刚开始玩 Grunt,对这个问题也很感兴趣... @iancrowther,Web 检查器使用的工具在 V8 中。有一个名为node-inspector 的项目与node --debug 对话,向连接的浏览器提供调试信息。这很棒,因为您可以将 Chrome 连接到节点检查器进程,并使用所有 Web 检查器工具来调试您的应用程序。 github.com/dannycoates/node-inspector 【参考方案1】:

2019 年更新

如果你想在调试模式下启动 grunt 任务并在第一行中断:

node --inspect-brk $(which grunt) taskName

如果您想在特定端口以调试模式启动 grunt 任务:

node --inspect-brk=8080 $(which grunt) taskName

如果你想将VSCODE附加到运行grunt调试会话的节点进程,在vscode中使用如下配置:


  // Use IntelliSense to learn about possible attributes.
  // Hover to view descriptions of existing attributes.
  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
  "version": "0.2.0",
  "configurations": [
    
    
      "type": "node",
      "request": "attach",
      "name": "Attach by port IP 5656",
      "port": 8080
    
  ]


【讨论】:

【参考方案2】:

这里有很好的答案。 2017 年,现在你可以做到了

node --inspect --debug-brk $(which grunt) taskName

打印类似的东西。

To start debugging, open the following URL in Chrome: chrome-devtools://devtools/bundled/inspector.html?experiments=true&v8only=true&ws=127.0.0.1:9229/232652c3-f63c-4b00-8de9-17dfad5db471

在 chrome 中打开该 URL,一切顺利!

我使用的是 Node 7.3.0,我在 Mac 上。您可能必须遵循其他帖子中的一些建议才能使其在 Windows 上运行。

【讨论】:

【参考方案3】:

Windows 解决方案

运行

node --debug-brk c:\Users\username\AppData\Roaming\npm\node_modules\grunt-cli\bin\grunt taskname

从带有Gruntfile.js 的目录中的 cmd。不要忘记将debugger; 行放在必要的地方。

【讨论】:

从 grunt 0.4 开始,grunt 入口点是 grunt-cli 包的一部分:node --debug-brk [..]\node_modules\grunt-cli\bin\grunt 非常感谢您的 Windows 说明。在 powershell 中,您可以使用波浪号使其不那么脆弱node --debug-brk (Resolve-Path ~\AppData\Roaming\npm\node_modules\grunt-cli\bin\grunt) taskname 伙计,我花了 30 分钟才弄清楚这一点,然后更新了我的答案!我应该向下滚动! 别忘了打开另一个控制台运行node-inspector @valter.santos.matos 实际上现在你应该使用下面提到的节点 --inspect【参考方案4】:

要在调试中运行 grunt,您需要将 grunt 脚本显式传递给节点:

node-debug $(which grunt) task

并在您的任务中添加debugger; 行。然后node-inspector 将打开带有调试工具的浏览器。

2014 年 2 月 28 日编辑

node-inspector 添加了命令node-debug,该命令以--debug 状态启动节点,并打开浏览器到node-inspector 页面,在遇到第一行debugger 时停止或设置断点。

2015 年 1 月 30 日编辑

在 Windows 上,事情有点复杂。有关说明,请参阅@e.gluhotorenko 的答案。

【讨论】:

这很棒。它也适用于其他全局安装的 npm bins。 node debug $(which grunt) 任务使用nodejs默认调试器 我遇到了一些麻烦。你能澄清一下$(which grunt) 是什么吗?它只是我要调试的 Gruntfile.js 吗?对于task,我是放(以serve为例)grunt serve还是只是serve?我已经尝试过node-debug Gruntfile.js serve 和很多其他的东西,但我就是无法让它工作。节点检查器打开并在第一行中断,但即使我将debugger; 行作为函数的第一行,我也无法进入serve 任务。 @brett,您使用的是 Windows 还是 OSX/Linux?在 unix 上,$(which grunt) 被替换为 grunt-cli grunt.js 脚本的完整路径。那是实际运行 Grunt 的脚本。如果您使用的是 Windows,请查看 ***.com/a/13443026/240358(下面的答案)以了解 grunt-cli 脚本的可能位置。这取代了您的命令中的grunt - 在您的示例中,将task 替换为serve 谢谢@DavidSouther,您想在答案中添加特定于 Windows 的部分吗?我真的应该转向 linux...【参考方案5】:

我最近创建了 grunt-node-inspector 来轻松配置 node-inspector 与您的 grunt 工作流程的其余部分,请查看:https://github.com/ChrisWren/grunt-node-inspector

这是 Gruntfile 的一部分,它说明了如何使用 grunt-node-inspector、grunt-concurrent 和 grunt-shell 调试 grunt 任务:https://github.com/CabinJS/Cabin/blob/master/Gruntfile.js#L44-L77

【讨论】:

你在想,运行node --debug-brk $(which grunt) node-inspector build test之类的东西?我喜欢这样。 差不多,除了我使用并发,因为node-inspector 不会退出并允许buildtest 运行,因为它永远运行。我添加了一个指向我设置它的 sn-p 的链接。 嗯。再三考虑……我的工作流程让我刚刚开始node-inspector &,将其留在后台,然后完成。您对此有何想法? 不知道为什么,但这似乎对我不起作用。我运行命令grunt node-inspector,然后转到localhost url,我看不到源文件。只需清空调试器工具即可。 我设法通过运行两个单独的命令来显示源代码。 grunt node-inspectornode --debug-brk Gruntfile.js 来自我的 grunt 目录。但是,当我在 grunt 文件中设置断点时,它会因连接错误而崩溃。【参考方案6】:

我已经完成了运行我的应用程序并启动节点检查器的任务。 它比现在的提议要好得多,你只需要在 gruntfile 中添加这个任务:

  grunt.registerTask('debug', 'My debug task.', function() 
        var done = this.async();
        grunt.util.spawn(
            cmd: 'node',
            args: ['--debug', 'app.js'],
            opts: 
                //cwd: current workin directory
            
        ,
        function (error, result, code) 
            if (error) 
                grunt.log.write (result);
                grunt.fail.fatal(error);
            
            done();
        );
        grunt.log.writeln ('node started');
        grunt.util.spawn(
            cmd: 'node-inspector',
            args: ['&'],
            opts: 
                //cwd: current workin directory
            
        ,
        function (error, result, code) 
            if (error) 
                grunt.log.write (result);
                grunt.fail.fatal(error);
            
            done();
        );
        grunt.log.writeln ('inspector started');
    );

【讨论】:

grunt-node-inspector 的作者说得对。此解决方案仅适用于 posix 环境,而他更容易配置节点检查器并且具有并发性,适用于 posix 和 windows。【参考方案7】:

要调试,我们必须修改bin下的grunt文件。在我的机器上,grunt 是全局安装的,所以我去了 /usr/local/lib/node_modules/grunt/bin 我打开文件并修改:

#!/usr/bin/env node

#!/usr/bin/env node --debug-brk

--debug-brk 将在 javascript 运行的第一行中断。

但仅仅这样做是不够的,因为您将无法在节点检查器的下拉列表中找到您的 grunt 任务 js 文件,因此您必须修改您有兴趣调试的文件通过在您希望断点发生的位置添加debugger;。 现在您可以在第一次休息后点击继续,您将在 debugger; 行休息

相当笨拙,但这是我迄今为止找到的唯一方法。

【讨论】:

这非常笨拙,因为它依赖于 /usr/bin/env 中的各种行为以及 shebang 行中 # 和 \n 之间未记录的魔法。 它对我不起作用。 Grunt 仍然在没有调试模式的情况下运行。 @DavidSouther Shebangs 并不是无证魔法。它们是标准化的 POSIX 行为

以上是关于将节点检查器与 Grunt 任务一起使用的主要内容,如果未能解决你的问题,请参考以下文章

Grunt 中类似 Nodemon 的任务:执行节点进程并观察

Grunt --force 因节点失败:错误选项

循环中的节点 Grunt 异步任务,闭包不起作用

将数据着色器与 PySpark DataFrame 一起使用

来自Webstorm的Grunt调试

任务运行程序(Gulp、Grunt 等)和捆绑程序(Webpack、Browserify)。为啥要一起使用?