Использование нод-инспектора с задачами Grunt

101

Кто-нибудь использовал инспектор узлов с Grunt для отладки приложений? Если нет, можете ли вы порекомендовать инструмент отладки для приложений на основе Grunt?

Я работаю с nodejs для приложения на стороне сервера, и у меня есть Grunt для использования разделенных задач (это потому, что пользователи могут выполнять задачи отдельно).

Хуано
источник
console.log - ваш друг ... Я хотел бы получить доступ к инспектору узлов, но я думаю, что инструменты отладки не являются частью V8. Насколько я понимаю, инструменты отладки - это сами по себе веб-приложения. Поправьте меня, если я ошибаюсь, потому что я хотел бы сделать то, что вы пытаетесь.
iancrowther
Да, система ведения журнала (я имею в виду console.log или другой механизм ведения журнала) всегда будет нашим другом, но мне нужен другой и более отлаживаемый способ. К настоящему времени я обнаружил некоторые недостающие требования к моему проекту с помощью grunt, поэтому я удалил его и использую nodejs как собственный, поэтому теперь я могу отлаживать с помощью node-инспектора. Я знаю, это не решение, но оно работает. Я думаю, что в будущем я снова добавлю grunt с добавлением node-Inspector и других инструментов / функций. И последнее, но не менее важное: это круто! Я использую его в других проектах и ​​действительно здорово!
JuanO 05
Только начал баловаться с Грунтом, тоже интересовался этим вопросом ...
Дмитрий Пашкевич
@iancrowther, инструменты, которые использует веб-инспектор, находятся в V8. Есть проект, с node-inspectorкоторым общается node --debug, предоставляя отладочную информацию браузеру, который подключается. Это замечательно, потому что вы можете подключить Chrome к процессу инспектора узлов и использовать все инструменты веб-инспектора для отладки приложения. github.com/dannycoates/node-inspector
Дэвид Саутер

Ответы:

135

Чтобы запустить grunt в отладке, вам нужно явно передать скрипт grunt в узел:

node-debug $(which grunt) task

и поставьте debugger;строку в своей задаче. node-inspectorзатем откроет браузер с инструментами отладки.

Редактировать 28 февраля 2014 г.

node-inspectorдобавил команду node-debug, которая запускает узел в --debugсостоянии и открывает браузер на node-inspectorстранице, останавливаясь, когда он достигает первой debuggerстроки или устанавливает точку останова.

Редактировать 30 января 2015 г.

В Windows дела обстоят немного сложнее. Инструкции см. В ответе @gluhotorenko.

Дэвид Саутер
источник
1
Это круто. Он также работает с другими глобально установленными ящиками npm.
pllee
1
Задача node debug $ (which grunt) использует отладчик nodejs по умолчанию
Томас Ромеро
3
У меня небольшие проблемы с этим. Не могли бы вы уточнить, что это $(which grunt)такое? Я хочу отладить только Gruntfile.js? А для taskчего ставить ( serveна примере) grunt serveили просто serve? Я пробовал node-debug Gruntfile.js serveи многое другое, но я просто не могу заставить это работать. Node-Inspector открывается, и он прерывается на первой строке, но я не могу взломать serveзадачу, даже если я поставил debugger;строку в качестве первой строки функции.
Brett
2
@brett, вы используете Windows или OSX / Linux? В unix $ (который grunt) заменяется полным путем к grunt.jsскрипту grunt-cli . Это сценарий, который фактически запускает Grunt. Если вы работаете в Windows, посмотрите на stackoverflow.com/a/13443026/240358 (ответ ниже) возможное расположение скрипта grunt-cli. Это займет место gruntв вашей команде - в вашем примере замените taskнаserve
David Souther
Спасибо @DavidSouther, вы хотите добавить в свой ответ часть, относящуюся к Windows? Мне действительно нужно просто перейти на Linux ...
Бретт
39

Решение для Windows

Бегать

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

из cmd в каталог с вашим Gruntfile.js. Не забудьте поставить debugger;леску в необходимых местах.

Евгений Глухоторенко
источник
3
Начиная с grunt 0.4, точка входа в grunt является частью grunt-cliпакета:node --debug-brk [..]\node_modules\grunt-cli\bin\grunt
mistaecko
4
Большое спасибо за инструкции для Windows. В PowerShell вы можете использовать тильду, чтобы сделать это немного менее хрупкимnode --debug-brk (Resolve-Path ~\AppData\Roaming\npm\node_modules\grunt-cli\bin\grunt) taskname
Джордж Мауэр
Чувак, я потратил 30 минут на то, чтобы понять это, а затем обновить свой ответ! Надо было просто прокрутить вниз!
Дэвид Саутер
1
Не забудьте открыть другую консоль и запуститьnode-inspector
valter.santos.matos
@ valter.santos.matos на самом деле теперь вам следует использовать узел - Inspect, упомянутый ниже
Джеки
7

Для отладки нам нужно изменить файл grunt в bin. На моей машине grunt установлен глобально, поэтому я перешел в / usr / local / lib / node_modules / grunt / bin, открыл файл и изменил:

#!/usr/bin/env node

Чтобы

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

--debug-brk прервется на первой строке запущенного javascript.

Одного этого недостаточно, так как вы не сможете найти js-файл задачи ворчания в раскрывающемся списке в инспекторе узлов, поэтому вам нужно изменить файл, который вы хотите отладить, добавив debugger;где вы хотите, чтобы сработала точка останова. Теперь вы можете нажать продолжить после первого перерыва, и вы разорветесь на своей debugger;строке

Довольно глупо, но пока что я нашел единственный способ.

user1577390
источник
2
Это невероятно запутанно, поскольку зависит от разнообразия поведения в / usr / bin / env и недокументированной магии между # и \ n в строке shebang.
Дэвид Саутер
2
Это не работает для меня. Grunt по-прежнему работает без режима отладки.
Евгений Глухоторенко
@DavidSouther Shebangs - это не недокументированная магия. Это стандартизованное поведение POSIX
Майлз Рут
6

Недавно я создал grunt-node-Inspector, чтобы легко настроить node-Inspector с остальной частью вашего рабочего процесса grunt, проверьте это: https://github.com/ChrisWren/grunt-node-inspector

Вот раздел Gruntfile, в котором показано, как можно отладить задачу grunt с помощью grunt-node-Inspector, grunt-concurrent и grunt-shell: https://github.com/CabinJS/Cabin/blob/master/Gruntfile. js # L44-L77

ChrisWren
источник
Вы думаете, что- node --debug-brk $(which grunt) node-inspector build testто вроде бега ? Мне нравится это.
Дэвид Саутер
В значительной степени, за исключением того, что я использую concurrent, потому node-inspectorчто не могу выйти и разрешить buildи testзапустить, поскольку он работает вечно. Я добавил ссылку на фрагмент, где он настроен.
ChrisWren
Хм. Если подумать ... мой рабочий процесс заставляет меня только начать node-inspector &, оставить его в фоновом режиме и назвать его выполненным. Есть ли у вас какие-либо мысли по этому поводу?
Дэвид Саутер
1
Не знаю почему, но, похоже, это не работает для меня. Я запускаю команду, grunt node-inspectorа затем перехожу к URL-адресу localhost и не вижу исходных файлов. Просто пустые инструменты отладчика.
Крис Холленбек
Мне удалось получить исходный код, выполнив две отдельные команды. grunt node-inspectorи node --debug-brk Gruntfile.jsиз моего каталога grunt. Однако, когда я устанавливаю точку останова в файле grunt, он просто вылетает с ошибкой соединения.
Крис Холленбек
4

Я выполнил задачу запустить свое приложение и запустить инспектор узлов. Это намного лучше, чем текущее предложение, вам просто нужно добавить эту задачу в 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
Автор grunt-node-Inspector прав. Это решение работает только в средах posix, в то время как его проще настроить node-Inspector, а при одновременном использовании работает с posix и окнами.
Rainabba
3

Отличные ответы здесь. В 2017 году теперь можно делать

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

Что печатает что-то вроде.

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

Откройте этот URL-адрес в Chrome, и все готово!

Я использую Node 7.3.0 и Mac. Возможно, вам придется последовать некоторым советам из других сообщений, чтобы запустить его в Windows.

RoccoB
источник
2

Обновление 2019

  • Если вы хотите запустить задачу grunt в режиме отладки и прервать первую строку:

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

  • Если вы хотите запустить задачу grunt в режиме отладки на определенном порту:

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

  • если вы хотите подключить VSCODE к процессу узла, выполняющему сеанс отладки grunt, используйте следующую конфигурацию в 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
источник