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


101

有人在Grunt上使用了节点检查器进行应用程序调试吗?如果没有,您能推荐基于Grunt的应用程序的调试工具吗?

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


console.log是您的朋友。.我很想访问node-inspector,但是我认为调试工具不是V8的一部分。据我了解,调试工具本身就是一个Web应用程序。如果我在这里错了,请指正我,因为我想做你的尝试。
iancrowther 2012年

是的,日志记录系统(我的意思是console.log或其他类型的日志记录机制)将永远是我们的朋友,但是我需要的是一种不同且更可调试的方式。到目前为止,我发现grunt对我的项目有一些遗漏的需求,所以我现在已经删除了它,并且使用了nodejs,因此现在可以使用node-inspector进行调试。我知道,这不是解决方案,但可以。我认为,将来,我将通过添加节点检查器和其他工具/功能来再次添加咕unt声。最后但并非最不重要的是,咕unt咕it的棒极了!我在其他项目中使用它,真的很麻烦!
JuanO 2012年

刚开始和Grunt一起玩耍,也对这个问题感兴趣...
Dmitry Pashkevich 2012年

@ iancrowther,Web检查器使用的工具在V8中。有一个名为的项目node-inspector,与进行对话node --debug,向连接的浏览器提供调试信息。这很棒,因为您随后可以将Chrome连接到节点检查器进程,并使用所有Web检查器工具调试您的应用。 github.com/dannycoates/node-inspector
David Souther

Answers:


135

要在调试中运行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的答案。


1
这很棒。它也可以在其他全局安装的npm箱中使用。
2014年

1
节点调试$(哪个咕unt声)任务使用nodejs默认调试器
Tomas Romero

3
我对此有点麻烦。你能澄清一下$(which grunt)是什么吗?只是我要调试的Gruntfile.js吗?而task我只想serve举一个例子呢?我已经尝试了很多其他方法,但是我无法使它正常工作。Node-inspector打开并在第一行中断,但是即使我将一行作为函数的第一行,我也无法中断任务。grunt serveservenode-debug Gruntfile.js serveservedebugger;
Brett 2014年

2
@brett,您使用的是Windows还是OSX / Linux?在Unix上,$(which grunt)被替换为grunt-cli grunt.js脚本的完整路径。那就是实际运行Grunt的脚本。如果您使用的是Windows,请查看stackoverflow.com/a/13443026/240358(此问题下方的答案),以获取grunt-cli脚本的可能位置。这将代替grunt您的命令-在您的示例中,替换taskserve
David Souther 2014年

感谢@DavidSouther,您是否想将Windows特定部分添加到您的答案中?我真的应该只转向linux ...
Brett 2014年

39

Windows解决方案

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

从目录中的cmd与您的Gruntfile.js。别忘了把debugger;线放在必要的地方。


3
从grunt 0.4开始,grunt入口点是grunt-cli软件包的一部分:node --debug-brk [..]\node_modules\grunt-cli\bin\grunt
mistaecko

4
非常感谢您提供Windows指导。在Powershell中,您可以使用波浪号使它更不那么脆弱node --debug-brk (Resolve-Path ~\AppData\Roaming\npm\node_modules\grunt-cli\bin\grunt) taskname
George Mauer

伙计,我只花了30分钟就解决了这个问题,然后更新了答案!我应该只是向下滚动!
David Souther

1
不要忘记打开另一个控制台并运行node-inspector
valter.santos.matos 2015年

@ valter.santos.matos实际上,现在您应该使用下面提到的--inspect节点
Jackie

7

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

#!/usr/bin/env node

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

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

但是,仅凭一己之力还不够,因为在节点检查器的下拉列表中您将无法找到自己笨拙的任务js文件,因此您必须通过添加以下debugger;位置来修改对调试感兴趣的文件:您希望断点发生。现在,您可以在第一个中断后单击“继续”,然后就debugger;行了。

相当狡猾,但这是我到目前为止发现的唯一方法。


2
这非常令人费解,因为它依赖于/ usr / bin / env中的多种行为以及在shebang行中#和\ n之间未记录的魔术。
大卫·索瑟

2
它对我不起作用。Grunt仍在没有调试模式下运行。
尤金·格卢霍托连科2012年

@DavidSouther Shebangs并不是无证的魔法。他们是标准化的POSIX行为
Miles Rout

6

我最近创建了grunt-node-inspector,可以轻松地将grunt-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运行,因为它始终运行。我将链接添加到片段中进行设置的地方。
ChrisWren

嗯 再次考虑...我的工作流程刚刚开始node-inspector &,将其保留在后台,然后调用完成。您对此有何想法?
大卫·索瑟

1
不知道为什么,但是这似乎不适用于我。我运行命令grunt node-inspector,然后转到localhost url,但看不到任何源文件。只是空的调试器工具。
克里斯·霍伦贝克

我设法通过运行两个单独的命令来显示源。grunt node-inspectornode --debug-brk Gruntfile.js从我的grunt目录中。但是,当我在grunt文件中设置一个断点时,它会因连接错误而崩溃。
克里斯·霍伦贝克

4

我已经完成了运行我的应用程序并启动node-inspector的任务。它比当前的命题要好得多,您只需要在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');
    });

1
grunt-node-inspector的作者是对的。该解决方案仅适用于posix环境,而他的节点检查器更易于配置,并且并发可用于posix和Windows。
rainabba 2013年

3

很好的答案。在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中打开该网址,一切顺利!

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


2

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
    }
  ]
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.