Utilisation de l'inspecteur de nœuds avec les tâches Grunt

101

Quelqu'un a-t-il utilisé l' inspecteur de nœuds avec Grunt pour le débogage d'application? Sinon, pouvez-vous recommander un outil de débogage pour les applications basées sur Grunt?

Je travaille avec nodejs pour une application côté serveur et j'ai Grunt pour utiliser des tâches séparées (c'est parce que les utilisateurs peuvent exécuter des tâches séparément).

JuanO
la source
console.log est votre ami .. J'aimerais accéder à node-inspector, mais je pense que les outils de débogage ne font pas partie de V8. Si je comprends bien, les outils de débogage sont une application Web à part entière. Corrigez-moi si je me trompe ici parce que je voudrais faire ce que vous essayez.
iancrowther
Oui, le système de journalisation (je veux dire console.log ou autre type de mécanisme de journalisation) sera toujours notre ami, mais ce dont j'ai besoin, c'est d'une manière différente et plus débuggable. À présent, j'ai trouvé des exigences manquantes pour mon projet avec grunt, donc j'ai supprimé maintenant et j'utilise nodejs comme il est propre afin que je puisse déboguer à l'aide de node-inspector maintenant. Je sais, ce n'est pas la solution, mais ça marche. Je pense que dans un futur, j'ajouterai à nouveau grognement avec l'inspecteur de nœuds et d'autres outils / fonctionnalités ajoutés. Dernier point mais non le moindre, grognement c'est génial! Je l'utilise dans d'autres projets et c'est vraiment génial!
JuanO
Je viens de commencer à jouer avec Grunt, également intéressé par cette question ...
Dmitry Pashkevich
@iancrowther, les outils utilisés par l'inspecteur Web sont en V8. Il existe un projet appelé node-inspectorqui communique avec node --debug, fournissant les informations de débogage à un navigateur qui se connecte. C'est génial, car vous pouvez ensuite connecter Chrome au processus de l'inspecteur de nœuds et utiliser tous les outils de l'inspecteur Web pour déboguer votre application. github.com/dannycoates/node-inspector
David Souther

Réponses:

135

Pour exécuter grunt dans le débogage, vous devez transmettre explicitement le script grunt au nœud:

node-debug $(which grunt) task

et mettez une debugger;ligne dans votre tâche. node-inspectorouvrira alors un navigateur avec des outils de débogage.

Edit 28 février 2014

node-inspectora ajouté la commande node-debug, qui lance le nœud dans un --debugétat et ouvre le navigateur sur la node-inspectorpage, s'arrêtant lorsqu'il atteint la première debuggerligne ou définit le point d'arrêt.

Edit 30 janvier 2015

Sous Windows, les choses sont un peu plus compliquées. Voir la réponse de @ e.gluhotorenko pour obtenir des instructions.

David Souther
la source
1
C'est bien. Il fonctionne également sur d'autres bins npm installés à l'échelle mondiale.
pllee
1
La tâche node debug $ (which grunt) utilise le débogueur par défaut de nodejs
Tomas Romero
3
J'ai un peu de mal avec ça. Pourriez-vous clarifier ce que $(which grunt)c'est? Est-ce juste le Gruntfile.js que je veux déboguer? Et pour taskdois-je mettre (en utilisant servecomme exemple) grunt serveou tout simplement serve? J'ai essayé node-debug Gruntfile.js serveet bien d'autres choses, mais je n'arrive tout simplement pas à faire fonctionner cela. L'inspecteur de nœud s'ouvre et il se casse sur la première ligne, mais je ne peux pas entrer dans la servetâche même si je mets une debugger;ligne comme première ligne de la fonction.
Brett
2
@brett, êtes-vous sur Windows ou OSX / Linux? Sous unix, $ (qui grogne) est remplacé par le chemin complet du grunt.jsscript grunt-cli . C'est le script qui exécute réellement Grunt. Si vous êtes sous Windows, consultez stackoverflow.com/a/13443026/240358 (la réponse ci-dessous) pour un emplacement possible du script grunt-cli. Cela remplace gruntdans votre commande - dans votre exemple, remplacez taskparserve
David Souther
Merci @DavidSouther, voulez-vous ajouter la partie spécifique à Windows à votre réponse? Je devrais vraiment passer à Linux ...
Brett
39

Solution Windows

Courir

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

à partir de cmd dans le répertoire avec votre Gruntfile.js. N'oubliez pas de mettre la debugger;ligne aux endroits nécessaires.

Eugène Gluhotorenko
la source
3
À partir de grunt 0.4, le point d'entrée du grunt fait partie du grunt-clipackage:node --debug-brk [..]\node_modules\grunt-cli\bin\grunt
mistaecko
4
Merci beaucoup pour les instructions Windows. Dans PowerShell, vous pouvez utiliser le tilde pour rendre cela un peu moins fragilenode --debug-brk (Resolve-Path ~\AppData\Roaming\npm\node_modules\grunt-cli\bin\grunt) taskname
George Mauer
Mec, je viens de passer 30 minutes à comprendre cela, puis à mettre à jour ma réponse! J'aurais dû juste faire défiler vers le bas!
David Souther
1
N'oubliez pas d'ouvrir une autre console et d'exécuternode-inspector
valter.santos.matos
@ valter.santos.matos en fait c'est maintenant que vous devriez utiliser le nœud --inspect mentionné ci-dessous
Jackie
7

Pour déboguer, nous devons modifier le fichier grunt sous bin. Sur ma machine, grunt est installé globalement, donc je suis allé dans / usr / local / lib / node_modules / grunt / bin j'ai ouvert le fichier et modifié:

#!/usr/bin/env node

À

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

--debug-brk se cassera sur la première ligne de javascript exécuté.

Faire cela seul n'est pas tout à fait suffisant, car vous ne pourrez pas trouver votre fichier js de tâche grognement dans la liste déroulante de l'inspecteur de nœuds, vous devez donc modifier le fichier que vous souhaitez déboguer en ajoutant debugger;où vous voulez que le point d'arrêt se produise. Vous pouvez maintenant cliquer sur Continuer après la première pause, et vous vous arrêterez sur votre debugger;ligne

Assez kludgy, mais c'est le seul moyen que j'ai trouvé jusqu'à présent.

user1577390
la source
2
C'est incroyablement loufoque, car il repose sur une variété de comportements dans / usr / bin / env et une magie non documentée entre # et \ n dans la ligne shebang.
David Souther
2
Cela ne fonctionne pas pour moi. Grunt fonctionne toujours sans mode de débogage.
Eugene Gluhotorenko
@DavidSouther Shebangs ne sont pas de la magie non documentée. Ils sont un comportement POSIX standardisé
Miles Rout
6

J'ai récemment créé grunt-node-inspector pour configurer facilement node-inspector avec le reste de votre flux de travail grunt, vérifiez-le: https://github.com/ChrisWren/grunt-node-inspector

Voici une section d'un Gruntfile qui illustre comment vous pouvez déboguer une tâche grunt en utilisant grunt-node-inspector, grunt-concurrent et grunt-shell: https://github.com/CabinJS/Cabin/blob/master/Gruntfile. js # L44-L77

ChrisWren
la source
Vous pensez, exécutez une node --debug-brk $(which grunt) node-inspector build testsorte de chose? J'aime ça.
David Souther
À peu près, sauf que j'utilise simultané, car node-inspectorje ne vais pas quitter et autoriser buildet testcourir car il fonctionne pour toujours. J'ai ajouté un lien vers un extrait de code dans lequel je l'ai configuré.
ChrisWren
Hmm. Après réflexion ... mon flux de travail me permet de commencer node-inspector &, de le laisser en arrière-plan et de l'appeler terminé. Avez-vous des pensées à ce sujet?
David Souther
1
Je ne sais pas pourquoi, mais cela ne semble pas fonctionner pour moi. J'exécute la commande grunt node-inspector, puis je vais à l'url localhost et je ne vois aucun fichier source. Juste des outils de débogage vides.
Kris Hollenbeck
J'ai réussi à faire apparaître la source en exécutant deux commandes distinctes. grunt node-inspectoret node --debug-brk Gruntfile.jsde mon répertoire grunt. Cependant, lorsque je définis un point d'arrêt dans le fichier grunt, il se bloque simplement avec une erreur de connexion.
Kris Hollenbeck
4

J'ai effectué une tâche pour exécuter mon application et lancer l'inspecteur de nœuds. C'est bien mieux que la proposition actuelle, il vous suffit d'ajouter cette tâche dans 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');
    });
Olivier Dufour
la source
1
L'auteur de grunt-node-inspector a raison. Cette solution ne fonctionne que sur les environnements posix alors que le sien est plus facile à configurer node-inspector et avec simultané, fonctionne sur posix et windows.
rainabba
3

Excellentes réponses ici. En 2017, maintenant vous pouvez faire

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

Ce qui imprime quelque chose comme.

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

Ouvrez cette URL dans Chrome, et vous êtes prêt à partir!

J'utilise Node 7.3.0 et je suis sur Mac. Vous devrez peut-être suivre certains des conseils d'autres articles pour le faire fonctionner sous Windows.

RoccoB
la source
2

Mise à jour 2019

  • Si vous souhaitez lancer la tâche grognement en mode débogage et interrompre à la première ligne:

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

  • Si vous souhaitez lancer la tâche grunt en mode débogage sur un port spécifique:

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

  • si vous souhaitez attacher VSCODE au processus de nœud exécutant la session de débogage de grunt, utilisez la configuration suivante dans 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
    }
  ]
}
ZEE
la source