Verwenden des Node-Inspector mit Grunt-Aufgaben


101

Hat jemand Node-Inspector mit Grunt zum Debuggen von Anwendungen verwendet? Wenn nicht, können Sie ein Debugging-Tool für Grunt-basierte Apps empfehlen?

Ich arbeite mit nodejs für eine serverseitige App und habe Grunt , um getrennte Aufgaben zu verwenden (dies liegt daran, dass Benutzer Aufgaben separat ausführen können).


console.log ist dein Freund. Ich würde gerne auf Node-Inspector zugreifen, aber ich denke, die Debug-Tools sind nicht Teil von V8. Soweit ich weiß, sind die Debug-Tools eine eigenständige Web-App. Korrigieren Sie mich, wenn ich hier falsch liege, weil ich gerne tun würde, was Sie versuchen.
iancrowther

Ja, das Protokollierungssystem (ich meine console.log oder eine andere Art von Protokollierungsmechanismus) wird immer unser Freund sein, aber was ich brauche, ist eine andere und debuggbarere Methode. Inzwischen habe ich mit grunzen einige fehlende Anforderungen an mein Projekt gefunden, daher habe ich sie inzwischen entfernt und verwende nodejs als eigenes, damit ich jetzt mit node-inspector debuggen kann. Ich weiß, es ist nicht die Lösung, aber es funktioniert. Ich denke, in Zukunft werde ich mit Node-Inspector und anderen hinzugefügten Tools / Features wieder Grunzen hinzufügen. Last but not least, grunzen, es ist großartig! Ich benutze es in anderen Projekten und rockt wirklich!
JuanO


@iancrowther, die Tools, die der Webinspektor verwendet, befinden sich in V8. Es gibt ein Projekt namens node-inspector, node --debugdas mit einem Browser, der eine Verbindung herstellt, kommuniziert und die Debug-Informationen bereitstellt. Dies ist fantastisch, da Sie Chrome dann mit dem Node-Inspector-Prozess verbinden und alle Webinspektor-Tools zum Debuggen Ihrer App verwenden können. github.com/dannycoates/node-inspector
David Souther

Antworten:


135

Um grunt im Debug auszuführen, müssen Sie das grunt-Skript explizit an den Knoten übergeben:

node-debug $(which grunt) task

und setzen Sie eine debugger;Zeile in Ihre Aufgabe. node-inspectoröffnet dann einen Browser mit Debugging-Tools.

Bearbeiten 28 Feb 2014

node-inspectorhat den Befehl hinzugefügt node-debug, der den Knoten in einem --debugZustand startet und den Browser für die node-inspectorSeite öffnet. Er stoppt, wenn er die erste debuggerZeile erreicht oder einen Haltepunkt setzt.

Bearbeiten Sie den 30. Januar 2015

Unter Windows sind die Dinge etwas komplizierter. Anweisungen finden Sie in der Antwort von @ e.gluhotorenko.


1
Das ist toll. Es funktioniert auch mit anderen global installierten npm-Bins.
Bitte

1
Node Debug $ (welches Grunzen) Task verwendet NodeJs Standard-Debugger
Tomas Romero

3
Ich habe ein bisschen Probleme damit. Könnten Sie klarstellen, was $(which grunt)ist? Ist es nur die Gruntfile.js, die ich debuggen möchte? Und für tasksetze ich ( serveals Beispiel) grunt serveoder nur serve? Ich habe node-debug Gruntfile.js serveviele andere Dinge ausprobiert, aber ich kann das einfach nicht zum Laufen bringen. Der Knoteninspektor wird geöffnet und in der ersten Zeile unterbrochen, aber ich kann nicht in die serveAufgabe einbrechen, selbst wenn ich eine debugger;Zeile als erste Zeile der Funktion eingefügt habe.
Brett

2
@brett, bist du unter Windows oder OSX / Linux? Unter Unix wird $ (welches Grunzen) durch den vollständigen Pfad zum grunt-cli- grunt.jsSkript ersetzt. Das ist das Skript, mit dem Grunt tatsächlich ausgeführt wird. Wenn Sie unter Windows arbeiten, suchen Sie unter stackoverflow.com/a/13443026/240358 (die Antwort darunter) nach einem möglichen Speicherort für das grunt-cli-Skript. Das nimmt den Platz gruntin Ihrem Kommando - in Ihrem Beispiel, ersetzen Sie taskmitserve
David Souther

Danke @DavidSouther, möchten Sie Ihrer Antwort den Windows-spezifischen Teil hinzufügen? Ich sollte wirklich nur auf Linux umsteigen ...
Brett

39

Windows-Lösung

Lauf

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

von cmd im Verzeichnis mit Ihrem Gruntfile.js. Vergessen Sie nicht, die debugger;Linie an den erforderlichen Stellen anzubringen.


3
Beginnend mit Grunzen 0.4 ist der Grunz-Einstiegspunkt Teil des grunt-cliPakets:node --debug-brk [..]\node_modules\grunt-cli\bin\grunt
Mistaecko

4
Vielen Dank für die Windows-Anweisungen. In Powershell können Sie die Tilde verwenden, um dies ein bisschen weniger zerbrechlich zu machennode --debug-brk (Resolve-Path ~\AppData\Roaming\npm\node_modules\grunt-cli\bin\grunt) taskname
George Mauer

Mann, ich habe gerade 30 Minuten damit verbracht, das herauszufinden und dann meine Antwort zu aktualisieren! Ich hätte einfach nach unten scrollen sollen!
David Souther

1
Vergessen Sie nicht, eine andere Konsole zu öffnen undnode-inspector
valter.santos.matos

@ valter.santos.matos eigentlich ist es jetzt, dass Sie den Knoten - Inspektion unten erwähnt
Jackie

7

Zum Debuggen müssen wir die Grunzdatei unter bin ändern. Auf meinem Computer ist grunt global installiert, also ging ich zu / usr / local / lib / node_modules / grunt / bin. Ich öffnete die Datei und änderte:

#!/usr/bin/env node

Zu

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

--debug-brk wird in der ersten Zeile von Javascript ausgeführt.

Dies allein reicht jedoch nicht aus, da Sie Ihre jun-Datei für die Grunzaufgabe in der Dropdown-Liste im Knoteninspektor nicht finden können. Sie müssen daher die Datei, die Sie debuggen möchten, ändern, indem Sie debugger;wo hinzufügen Sie möchten, dass der Haltepunkt eintritt. Jetzt können Sie nach der ersten Pause auf Weiter klicken und auf Ihrer debugger;Linie brechen

Ziemlich klobig, aber es ist der einzige Weg, den ich bisher gefunden habe.


2
Dies ist unglaublich klobig, da es auf einer Vielzahl von Verhaltensweisen in / usr / bin / env und undokumentierter Magie zwischen # und \ n in der Shebang-Zeile beruht.
David Souther

2
Es funktioniert nicht bei mir. Grunt läuft immer noch ohne Debug-Modus.
Eugene Gluhotorenko

@DavidSouther Shebangs sind keine undokumentierte Magie. Sie sind standardisiertes POSIX-Verhalten
Miles Rout

6

Ich habe kürzlich grunt-node-inspector erstellt, um Node-inspector einfach mit dem Rest Ihres Grunt-Workflows zu konfigurieren. Schauen Sie sich das an: https://github.com/ChrisWren/grunt-node-inspector

Hier ist ein Abschnitt einer Grunt-Datei, der zeigt, wie Sie eine Grunt-Aufgabe mit Grunt-Node-Inspector, Grunt-Concurrent und Grunt-Shell debuggen können: https://github.com/CabinJS/Cabin/blob/master/Gruntfile. js # L44-L77


Du denkst, so etwas laufen node --debug-brk $(which grunt) node-inspector build test? Ich mag es.
David Souther

Ziemlich genau, außer ich benutze gleichzeitig, weil node-inspectores nicht beendet und erlaubt buildund testausgeführt wird, da es für immer läuft. Ich habe einen Link zu einem Snippet hinzugefügt, in dem ich ihn eingerichtet habe.
ChrisWren

Hmm. Beim zweiten Gedanken ... mein Workflow hat mich gerade erst gestartet node-inspector &, im Hintergrund belassen und als erledigt bezeichnet. Hast du irgendwelche Gedanken dazu?
David Souther

1
Ich weiß nicht warum, aber das scheint bei mir nicht zu funktionieren. Ich führe den Befehl aus grunt node-inspectorund gehe dann zur localhost-URL und sehe keine Quelldateien. Einfach leere Debugger-Tools.
Kris Hollenbeck

Ich habe es geschafft, die Quelle durch zwei separate Befehle zum Anzeigen zu bringen. grunt node-inspectorund node --debug-brk Gruntfile.jsaus meinem Grunzverzeichnis. Wenn ich jedoch einen Haltepunkt in der Grunzdatei setze, stürzt dieser nur mit einem Verbindungsfehler ab.
Kris Hollenbeck

4

Ich habe eine Aufgabe ausgeführt, um meine App auszuführen und den Knoteninspektor zu starten. Es ist weitaus besser als der aktuelle Vorschlag. Sie müssen diese Aufgabe nur in gruntfile hinzufügen:

  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
Der Autor von grunt-node-inspector hat es richtig. Diese Lösung funktioniert nur in Posix-Umgebungen, während der Node-Inspector einfacher zu konfigurieren ist und gleichzeitig unter Posix und Windows funktioniert.
rainabba

3

Tolle Antworten hier. Im Jahr 2017 können Sie jetzt tun

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

Welches druckt so etwas.

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

Öffnen Sie diese URL in Chrome und los geht's!

Ich benutze Node 7.3.0 und bin auf einem Mac. Möglicherweise müssen Sie einige der Ratschläge in anderen Beiträgen befolgen, um es unter Windows zum Laufen zu bringen.


2

Update 2019

  • Wenn Sie die Grunzaufgabe im Debug-Modus starten und in der ersten Zeile brechen möchten:

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

  • Wenn Sie die Grunzaufgabe im Debug-Modus an einem bestimmten Port starten möchten:

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

  • Wenn Sie VSCODE an den Knotenprozess anhängen möchten, auf dem die Debugging-Sitzung von grunt ausgeführt wird, verwenden Sie die folgende Konfiguration in 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
    }
  ]
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.