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

     2023-03-07     239

关键词:

【中文标题】将节点检查器与 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 行为

将包管理器与 Domino 和节点模块的位置一起使用

】将包管理器与Domino和节点模块的位置一起使用【英文标题】:UseofapackagemanagerwithDominoandlocationsofnodemodules【发布时间】:2020-05-0407:28:42【问题描述】:我正在考虑使用包管理器来避免在GIT中注册外部资源。但我想知道我应该如... 查看详情

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

】任务运行程序(Gulp、Grunt等)和捆绑程序(Webpack、Browserify)。为啥要一起使用?【英文标题】:TaskRunners(Gulp,Grunt,etc)andBundlers(Webpack,Browserify).Whyusetogether?任务运行程序(Gulp、Grunt等)和捆绑程序(Webpack、Browserify)。为什么要... 查看详情

警告:spawn ENOENT 与 Grunt sass 任务一起使用

】警告:spawnENOENT与Gruntsass任务一起使用【英文标题】:Warning:spawnENOENTUsewithGruntsasstask【发布时间】:2014-09-2502:44:00【问题描述】:我最近下载了OSXYosemite,现在grunt-contrib-sass无法正常工作,我收到错误消息:Running"sass:dist"(sass)ta... 查看详情

将 Gaufrette 流包装器与 AsseticBundle 一起使用

】将Gaufrette流包装器与AsseticBundle一起使用【英文标题】:UsingGaufretteStreamWrapperswithAsseticBundle【发布时间】:2014-08-0709:09:31【问题描述】:我正在尝试使用GaufretteStreamWrapper来告诉AsseticBundle将项目资产转储到哪里,但我无法让它识... 查看详情

如何将 ListView 构建器与提供程序一起使用?

】如何将ListView构建器与提供程序一起使用?【英文标题】:HowtouseListViewbuilderwithProviders?【发布时间】:2020-10-2422:50:29【问题描述】:我正在尝试使用ListViewBuilder和Provider创建水平滚动卡片。Likethisone还有其他方法可以达到同样... 查看详情

将 MaterialUI 伪类选择器与 makeStyles 一起使用

】将MaterialUI伪类选择器与makeStyles一起使用【英文标题】:UseMaterialUIpseudo-classesselectorswithmakeStyles【发布时间】:2021-09-0108:59:36【问题描述】:根据docs,MaterialUI在组件处于某种状态时提供了某些伪类,例如selected我已经尝试过使... 查看详情

您将如何将订阅管理器与流星的模板订阅一起使用?

】您将如何将订阅管理器与流星的模板订阅一起使用?【英文标题】:howwouldyouusesubscriptionmanagerswithmeteor\'stemplatesubscriptions?【发布时间】:2015-06-2422:25:09【问题描述】:Meteor最近引入了模板订阅功能。您现在可以在Temeplate.xyz.onCr... 查看详情

将 Bagging 分类器与支持向量机模型一起使用

】将Bagging分类器与支持向量机模型一起使用【英文标题】:UseBaggingClassifierwithasupportvectormachinemodel【发布时间】:2019-04-2613:19:51【问题描述】:当我尝试执行时svm=SVC(gamma=\'auto\',random_state=42,probability=True)BaggingClassifier(base_estimator=s... 查看详情

如何将 DRF 序列化器与 Graphene 一起使用

】如何将DRF序列化器与Graphene一起使用【英文标题】:HowtouseDRFserializerswithGraphene【发布时间】:2019-08-2302:35:12【问题描述】:我正在关注thistutorial使用Graphene和Django,一切都很顺利,直到我到达IntegrationwithDjangoRestFrameworksection。... 查看详情

如何将自定义管理器与相关对象一起使用?

】如何将自定义管理器与相关对象一起使用?【英文标题】:Howtousecustommanagerwithrelatedobjects?【发布时间】:2011-11-2107:45:46【问题描述】:我有一个自定义管理器。我想将它用于相关对象。我在文档中找到了use_for_related_fields。但... 查看详情

通过协议扩展将选择器与协议方法的默认实现一起使用

】通过协议扩展将选择器与协议方法的默认实现一起使用【英文标题】:Usingselectorswithdefaultimplementationsofprotocolmethodsviaprotocolextensions【发布时间】:2017-05-1619:40:49【问题描述】:我正在尝试制定一个ViewController可以实现的协议,... 查看详情

将复杂的 jquery 选择器与 PuppeteerSharp 一起使用

】将复杂的jquery选择器与PuppeteerSharp一起使用【英文标题】:UsecomplexjqueryselectorwithPuppeteerSharp【发布时间】:2021-12-0903:44:13【问题描述】:我是PuppeteerSharp的新手,我已经在互联网上搜索了几个小时以及文档,但我似乎没有找到... 查看详情

将 grunt 与现有的 wordpress 实例一起使用

】将grunt与现有的wordpress实例一起使用【英文标题】:Usegruntwithanexistingwordpressinstance【发布时间】:2015-03-2123:22:05【问题描述】:在这种情况下,我试图弄清楚如何缩小和组合js/css代码:我购买了一个主题,没有开发它我正在使... 查看详情

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

】Grunt--force因节点失败:错误选项【英文标题】:Grunt--forcefailswithnode:badoption【发布时间】:2018-09-0313:01:16【问题描述】:我有一个名为eslint:jenkins的Grunt任务,它在项目上运行eslint。在构建管道中,我将其运行为:grunteslint:jenkin... 查看详情

将 JQuery 的日期选择器与引导程序一起使用

】将JQuery的日期选择器与引导程序一起使用【英文标题】:UsingJQuery\'sdatepickerwithbootstrap【发布时间】:2018-10-1316:08:11【问题描述】:在我将bootstrap4添加到我的jQuery项目之前,日期选择器看起来像这样:添加bootstrap4后,日期选择... 查看详情

将 Django 分页器与具有不同显示数量的嵌套模板一起使用

】将Django分页器与具有不同显示数量的嵌套模板一起使用【英文标题】:UsingDjangopaginatorwithnestedtemplateswithdifferentnumberofdisplays【发布时间】:2016-09-0815:28:19【问题描述】:我正在使用DjangoPaginator来设置我的列表视图。在我的默认... 查看详情

如何将多图像选择器与 Flutter Image Compress 一起使用?

】如何将多图像选择器与FlutterImageCompress一起使用?【英文标题】:HowtouseMultiImagepickerwithFlutterImageCompress?【发布时间】:2020-12-1216:57:42【问题描述】:我已经成功实现了颤振多图像选择器。但我想降低它的质量。我见过有人说它... 查看详情

将 CSS plus 选择器与自定义组件一起使用

】将CSSplus选择器与自定义组件一起使用【英文标题】:UsingCSSplusselectorwithcustomcomponents【发布时间】:2020-04-0218:54:22【问题描述】:在CSS中,您可以使用加号选择器来选择跟在另一个元素之后的元素。例如,选择h1s之后的所有divs... 查看详情