Używanie inspektora węzła z zadaniami Grunt

101

Czy ktoś używał inspektora węzła z Gruntem do debugowania aplikacji? Jeśli nie, czy możesz polecić narzędzie do debugowania aplikacji opartych na Grunt?

Pracuję z nodejs dla aplikacji po stronie serwera i mam Grunt do używania oddzielnych zadań ( dzieje się tak, ponieważ użytkownicy mogą wykonywać zadania oddzielnie).

JuanO
źródło
console.log to twój przyjaciel. Chciałbym uzyskać dostęp do node-inspector, ale myślę, że narzędzia do debugowania nie są częścią V8. Jak rozumiem, narzędzia do debugowania są samodzielną aplikacją internetową. Popraw mnie, jeśli się mylę, ponieważ chciałbym zrobić to, co próbujesz.
iancrowther,
Tak, system logowania (mam na myśli console.log lub inny rodzaj mechanizmu logowania) zawsze będzie naszym przyjacielem, ale to, czego potrzebuję, to inny i bardziej debugowalny sposób. Do tej pory znalazłem brakujące wymagania w moim projekcie z gruntem, więc usunąłem go do tej pory i używam nodejs jako jego własnego, więc mogę teraz debugować za pomocą node-inspector. Wiem, że to nie jest rozwiązanie, ale działa. Myślę, że w przyszłości ponownie dodam chrząknięcie z inspektorem węzła i innymi dodanymi narzędziami / funkcjami. Wreszcie, chrząknięcie, to niesamowite! Używam go w innych projektach i naprawdę rządzi!
JuanO,
Właśnie zacząłem bawić się z Gruntem, również zainteresowany tym pytaniem ...
Dmitry Pashkevich
@iancrowther, narzędzia używane przez inspektora sieci są w wersji 8. Istnieje projekt o nazwie, z node-inspectorktórym rozmawia node --debug, dostarczając informacje debugowania do przeglądarki, która się łączy. To niesamowite, ponieważ możesz następnie podłączyć Chrome do procesu inspektora węzłów i użyć wszystkich narzędzi inspektora sieci do debugowania aplikacji. github.com/dannycoates/node-inspector
David Souther

Odpowiedzi:

135

Aby uruchomić grunt podczas debugowania, musisz jawnie przekazać skrypt do węzła:

node-debug $(which grunt) task

i umieść debugger;linię w swoim zadaniu. node-inspectorotworzy przeglądarkę z narzędziami do debugowania.

Edycja 28 lutego 2014

node-inspectordodał polecenie node-debug, które uruchamia węzeł w --debugstanie i otwiera przeglądarkę na node-inspectorstronie, zatrzymując się, gdy trafi w pierwszą debuggerlinię lub ustawia punkt przerwania.

Edycja 30 stycznia 2015

W systemie Windows sytuacja jest nieco bardziej skomplikowana. Instrukcje znajdują się w odpowiedzi od @ e.gluhotorenko.

David Souther
źródło
1
To jest świetne. Działa również na innych globalnie zainstalowanych pojemnikach npm.
pllee
1
node debug $ (which grunt) task używa domyślnego debuggera nodejs
Tomas Romero
3
Mam z tym trochę problemów. Czy mógłbyś wyjaśnić, co $(which grunt)to jest? Czy to tylko plik Gruntfile.js, który chcę debugować? I za taskco wstawię (używając servejako przykładu), grunt serveczy po prostu serve? Próbowałem node-debug Gruntfile.js servei wielu innych rzeczy, ale po prostu nie mogę tego zrobić. Node-inspector otwiera się i przerywa w pierwszej linii, ale nie mogę włamać się do servezadania, nawet jeśli wstawię debugger;linię jako pierwszą linię funkcji.
Brett,
2
@brett, korzystasz z systemu Windows lub OSX / Linux? W systemie Unix, $ (który grunt) zostaje zastąpiony pełną ścieżką do grunt.jsskryptu grunt-cli . To jest skrypt, który faktycznie uruchamia Grunt. Jeśli korzystasz z systemu Windows, spójrz na stackoverflow.com/a/13443026/240358 (odpowiedź poniżej), aby znaleźć możliwą lokalizację skryptu grunt-cli. Który zajmuje miejsce gruntw swojej komendzie - w przykładzie, wymienić taskzserve
David Souther
Dzięki @DavidSouther, czy chcesz dodać część dotyczącą systemu Windows do swojej odpowiedzi? Naprawdę powinienem przejść na Linuksa ...
Brett
39

Rozwiązanie Windows

Biegać

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

z cmd w katalogu z plikiem Gruntfile.js. Nie zapomnij umieścić debugger;linki w niezbędnych miejscach.

Eugene Gluhotorenko
źródło
3
Zaczynając od gruntu 0.4, punkt wejścia grunt-clinode --debug-brk [..]\node_modules\grunt-cli\bin\grunt
gruntów
4
Bardzo dziękuję za instrukcje dotyczące systemu Windows. W PowerShell możesz użyć tyldy, aby uczynić to nieco mniej delikatnymnode --debug-brk (Resolve-Path ~\AppData\Roaming\npm\node_modules\grunt-cli\bin\grunt) taskname
George Mauer,
Człowieku, spędziłem 30 minut, zastanawiając się nad tym, a potem aktualizując swoją odpowiedź! Powinienem był po prostu przewinąć w dół!
David Souther
1
Nie zapomnij otworzyć kolejnej konsoli i uruchomićnode-inspector
valter.santos.matos
@ valter.santos.matos właściwie to teraz powinieneś użyć węzła - sprawdź wspomniane poniżej
Jackie
7

Aby debugować, musimy zmodyfikować plik gruntowy w bin. Na moim komputerze grunt jest zainstalowany globalnie, więc przeszedłem do / usr / local / lib / node_modules / grunt / bin, otworzyłem plik i zmodyfikowałem:

#!/usr/bin/env node

Do

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

--debug-brk zepsuje pierwszą linię uruchomionego javascript.

Samo zrobienie tego nie wystarczy, ponieważ nie będziesz w stanie znaleźć pliku js z zadaniem gruntownym w menu rozwijanym w inspektorze węzłów, więc musisz zmodyfikować plik, który chcesz debugować, dodając debugger;gdzie chcesz, aby nastąpił punkt przerwania. Teraz możesz kliknąć Kontynuuj po pierwszej przerwie, a przerwiesz na debugger;linii

Dość niezdarnie, ale to jedyny sposób, jaki do tej pory znalazłem.

user1577390
źródło
2
Jest to niewiarygodnie niezdarne, ponieważ opiera się na różnych zachowaniach w / usr / bin / env i nieudokumentowanej magii między # a \ n w linii shebang.
David Souther
2
Nie działa mi. Grunt nadal działa bez trybu debugowania.
Eugene Gluhotorenko
@DavidSouther Shebangs nie są nieudokumentowaną magią. To standardowe zachowanie POSIX
Miles Rout
6

Niedawno utworzyłem inspektora grunt-node, aby łatwo skonfigurować inspektora węzła z resztą przepływu pracy, sprawdź to: https://github.com/ChrisWren/grunt-node-inspector

Oto sekcja pliku Gruntfile, która ilustruje, jak można debugować zadanie gruntowe za pomocą grunt-node-inspector, grunt-concurrent i grunt-shell: https://github.com/CabinJS/Cabin/blob/master/Gruntfile. js # L44-L77

ChrisWren
źródło
Myślisz, node --debug-brk $(which grunt) node-inspector build testcoś w stylu biegania ? Lubię to.
David Souther,
Prawie, z wyjątkiem tego, że używam trybu współbieżnego, ponieważ node-inspectornie wyjdzie i nie pozwoli buildi nie testbędzie działać, ponieważ działa wiecznie. Dodałem link do fragmentu, w którym mam go skonfigurować.
ChrisWren
Hmm. Po namyśle ... mój przepływ pracy sprawia, że ​​dopiero zaczynam node-inspector &, zostawiam go w tle i nazywam go zakończonym. Jakieś przemyślenia na ten temat?
David Souther
1
Nie wiem dlaczego, ale wydaje mi się, że to nie działa. Uruchamiam polecenie, grunt node-inspectora następnie przechodzę do adresu URL localhost i nie widzę plików źródłowych. Po prostu puste narzędzia debuggera.
Kris Hollenbeck
Udało mi się wyświetlić źródło, uruchamiając dwa oddzielne polecenia. grunt node-inspectoriz node --debug-brk Gruntfile.jsmojego katalogu gruntowego. Jednak kiedy ustawię punkt przerwania w pliku gruntowym, po prostu zawiesza się z błędem połączenia.
Kris Hollenbeck
4

Wykonałem zadanie, aby uruchomić moją aplikację i uruchomić node-inspector. Jest o wiele lepsze niż obecna propozycja, wystarczy dodać to zadanie w 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
źródło
1
Autor inspektora grunt-węzłów ma rację. To rozwiązanie działa tylko na środowiskach POSIX, podczas gdy jego jest łatwiejsze do skonfigurowania node-inspector, a przy współbieżnym działa na POSIX i Windows.
rainabba,
3

Świetne odpowiedzi tutaj. W 2017 roku możesz to zrobić

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

Który drukuje coś w stylu.

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

Otwórz ten adres URL w chrome i gotowe!

Używam Node 7.3.0 i używam Maca. Być może będziesz musiał postępować zgodnie z poradami w innych postach, aby uruchomić go w systemie Windows.

RoccoB
źródło
2

Aktualizacja 2019

  • Jeśli chcesz uruchomić zadanie gruntowne w trybie debugowania i przerwać w pierwszym wierszu:

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

  • Jeśli chcesz uruchomić zadanie gruntowne w trybie debugowania na określonym porcie:

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

  • jeśli chcesz dołączyć kod VSCODE do procesu węzła, który uruchamia sesję debugowania grunt, użyj następującej konfiguracji w 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
źródło