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).


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.


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.


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.


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


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');
    });

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.


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
    }
  ]
}
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.