Usando el inspector de nodos con tareas de Grunt

101

¿Alguien usó el inspector de nodos con Grunt para la depuración de aplicaciones? Si no es así, ¿puede recomendar una herramienta de depuración para aplicaciones basadas en Grunt?

Estoy trabajando con nodejs para una aplicación del lado del servidor y tengo Grunt para usar tareas separadas (esto se debe a que los usuarios pueden ejecutar tareas por separado).

JuanO
fuente
console.log es tu amigo. Me encantaría acceder al inspector de nodos, pero creo que las herramientas de depuración no son parte de V8. Según tengo entendido, las herramientas de depuración son una aplicación web por derecho propio. Corrígeme si me equivoco aquí porque me gustaría hacer lo que estás intentando.
iancrowther
Sí, el sistema de registro (me refiero a console.log u otro tipo de mecanismo de registro) será siempre nuestro amigo, pero lo que necesito es una forma diferente y más depurable. A estas alturas, encontré algunos requisitos faltantes en mi proyecto con gruñido, así que ya los he eliminado y estoy usando nodejs como propio para poder depurar usando el inspector de nodos ahora. Lo sé, no es la solución, pero funciona. Creo que, en un futuro, agregaré gruñido nuevamente con el inspector de nodos y otras herramientas / características agregadas. Por último, pero no menos importante, gruñido, ¡es increíble! ¡Lo estoy usando en otros proyectos y realmente es genial!
JuanO
Acabo de empezar a jugar con Grunt, también interesado en esa pregunta ...
Dmitry Pashkevich
@iancrowther, las herramientas que utiliza el inspector web están en V8. Hay un proyecto llamado node-inspectorque habla y node --debugproporciona la información de depuración a un navegador que se conecta. Esto es increíble, porque luego puede conectar Chrome al proceso del inspector de nodos y usar todas las herramientas del inspector web para depurar su aplicación. github.com/dannycoates/node-inspector
David Souther

Respuestas:

135

Para ejecutar grunt en depuración, debe pasar el script grunt al nodo explícitamente:

node-debug $(which grunt) task

y ponga una debugger;línea en su tarea. node-inspectorluego abrirá un navegador con herramientas de depuración.

Editar 28 de febrero de 2014

node-inspectorha agregado el comando node-debug, que lanza el nodo en un --debugestado y abre el navegador a la node-inspectorpágina, deteniéndose cuando llega a la primera debuggerlínea o establece un punto de interrupción.

Edición 30 de enero de 2015

En Windows, las cosas son un poco más complicadas. Consulte la respuesta de @ exampleluhotorenko para obtener instrucciones.

David Souther
fuente
1
Esto es genial. También funciona en otros contenedores npm instalados globalmente.
pllee
1
La tarea de depuración de nodo $ (que gruñido) utiliza el depurador predeterminado de nodejs
Tomas Romero
3
Estoy teniendo algunos problemas con esto. ¿Podrías aclarar qué $(which grunt)es? ¿Es solo el Gruntfile.js lo que quiero depurar? ¿Y para taskponer (usar servecomo ejemplo) grunt serveo simplemente serve? Lo he intentado node-debug Gruntfile.js servey muchas otras cosas, pero no puedo hacer que esto funcione. Node-inspector se abre y se rompe en la primera línea, pero no puedo entrar en la servetarea incluso si coloco una debugger;línea como primera línea de la función.
Brett
2
@brett, ¿estás en Windows o OSX / Linux? En Unix, $ (que gruñido) se reemplaza con la ruta completa al grunt.jsguión grunt-cli . Ese es el script que realmente ejecuta Grunt. Si está en Windows, consulte stackoverflow.com/a/13443026/240358 (la respuesta a continuación) para ver una posible ubicación del script grunt-cli. Eso toma el lugar de grunten su comando - en su ejemplo, reemplácelo taskconserve
David Souther
Gracias @DavidSouther, ¿desea agregar la parte específica de Windows a su respuesta? Realmente debería hacer el cambio a Linux ...
Brett
39

Solución de Windows

correr

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

de cmd en el directorio con su Gruntfile.js. No olvide poner debugger;línea en los lugares necesarios.

Eugene Gluhotorenko
fuente
3
Comenzando con gruñido 0.4, el punto de entrada de gruñido es parte del grunt-clipaquete:node --debug-brk [..]\node_modules\grunt-cli\bin\grunt
misecko
4
Muchas gracias por las instrucciones de Windows. En powershell, puede usar la tilde para hacer esto un poco menos frágilnode --debug-brk (Resolve-Path ~\AppData\Roaming\npm\node_modules\grunt-cli\bin\grunt) taskname
George Mauer
¡Hombre, acabo de pasar 30 minutos averiguando esto y luego actualizando mi respuesta! ¡Debería haberme desplazado hacia abajo!
David Souther
1
No olvide abrir otra consola y ejecutarnode-inspector
valter.santos.matos
@ valter.santos.matos en realidad ahora debe usar el nodo --inspección que se menciona a continuación
Jackie
7

Para depurar, tenemos que modificar el archivo grunt en bin. En mi máquina, grunt está instalado globalmente, así que fui a / usr / local / lib / node_modules / grunt / bin, abrí el archivo y modifiqué:

#!/usr/bin/env node

A

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

--debug-brk se romperá en la primera línea de javascript ejecutado.

Sin embargo, hacer eso solo no es suficiente, ya que no podrá encontrar su archivo js de tarea gruñona en el menú desplegable en el inspector de nodos, por lo que debe modificar el archivo que le interesa depurar agregando debugger;where quieres que suceda el punto de ruptura. Ahora puede hacer clic en Continuar después del primer descanso, y saldrá de su debugger;línea.

Bastante torpe, pero es la única forma que he encontrado hasta ahora.

usuario1577390
fuente
2
Esto es increíblemente torpe, ya que se basa en una variedad de comportamientos en / usr / bin / env y magia indocumentada entre # y \ n en la línea shebang.
David Souther
2
No me funciona. Grunt todavía se ejecuta sin el modo de depuración.
Eugene Gluhotorenko
@DavidSouther Shebangs no son magia indocumentada. Son comportamiento POSIX estandarizado
Miles Rout
6

Recientemente creé grunt-node-inspector para configurar fácilmente el inspector de nodos con el resto de su flujo de trabajo de grunt, compruébelo: https://github.com/ChrisWren/grunt-node-inspector

Aquí hay una sección de un Gruntfile que ilustra cómo puede depurar una tarea grunt usando grunt-node-inspector, grunt-concurrent y grunt-shell: https://github.com/CabinJS/Cabin/blob/master/Gruntfile. js # L44-L77

ChrisWren
fuente
¿Estás pensando, correr node --debug-brk $(which grunt) node-inspector build testalgo así? Me gusta eso.
David Souther
Más o menos, excepto yo uso concurrente, porque node-inspectorno va a salir y permitir buildy testpara funcionar ya que se ejecuta siempre. Agregué un enlace a un fragmento donde lo tengo configurado.
ChrisWren
Hmm. Pensándolo bien ... mi flujo de trabajo me tiene comenzando node-inspector &, dejándolo en segundo plano y llamándolo hecho. ¿Alguna idea tuya sobre eso?
David Souther
1
No estoy seguro de por qué, pero esto no parece funcionar para mí. Ejecuto el comando grunt node-inspectory luego voy a la URL de localhost y no veo archivos de origen. Solo herramientas de depuración vacías.
Kris Hollenbeck
Logré que apareciera la fuente ejecutando dos comandos separados. grunt node-inspectory node --debug-brk Gruntfile.jsdesde mi directorio gruñido. Sin embargo, cuando establezco un punto de interrupción en el archivo gruñido, simplemente se bloquea con un error de conexión.
Kris Hollenbeck
4

He realizado una tarea para ejecutar mi aplicación y ejecutar el inspector de nodos. Es mucho mejor que la propuesta actual, solo tiene que agregar esta tarea en 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
fuente
1
El autor de grunt-node-inspector tiene razón. Esta solución solo funciona en entornos posix, mientras que la suya es más fácil de configurar nodo-inspector y con concurrente, funciona en posix y windows.
rainabba
3

Grandes respuestas aquí. En 2017, ahora puedes hacer

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

Lo que imprime algo como.

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

Abre esa URL en Chrome, ¡y listo!

Estoy usando Node 7.3.0 y estoy en Mac. Es posible que deba seguir algunos de los consejos en otras publicaciones para que funcione en Windows.

RoccoB
fuente
2

Actualización 2019

  • Si desea iniciar la tarea gruñido en modo de depuración y romper en la primera línea:

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

  • Si desea iniciar la tarea grunt en modo de depuración en un puerto específico:

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

  • si desea adjuntar VSCODE al proceso de nodo que ejecuta la sesión de depuración de grunt, use la siguiente configuración en 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
fuente