Sử dụng trình kiểm tra nút với các tác vụ Grunt


101

Có ai đó đã sử dụng trình kiểm tra nút với Grunt để gỡ lỗi ứng dụng không? Nếu không, bạn có thể giới thiệu một công cụ gỡ lỗi cho các ứng dụng dựa trên Grunt không?

Tôi đang làm việc với nodejs cho một ứng dụng phía máy chủ và tôi có Grunt để sử dụng các tác vụ riêng biệt (điều này là do người dùng có thể thực thi các tác vụ riêng biệt).


console.log là bạn của bạn .. Tôi rất thích truy cập vào node-ins Inspector, nhưng tôi nghĩ rằng các công cụ gỡ lỗi không phải là một phần của V8. Theo tôi hiểu, các công cụ gỡ lỗi là một ứng dụng web theo đúng nghĩa của chúng. Hãy sửa cho tôi nếu tôi sai ở đây vì tôi muốn làm những gì bạn cố gắng.
iancrowther

Vâng, hệ thống ghi nhật ký (ý tôi là console.log hoặc loại cơ chế ghi nhật ký khác) sẽ luôn là người bạn của chúng ta, nhưng những gì tôi cần, là một cách khác và dễ gỡ lỗi hơn. Hiện tại, tôi đã tìm thấy một số yêu cầu còn thiếu đối với dự án của mình với grunt vì vậy tôi đã loại bỏ ngay bây giờ và tôi đang sử dụng nodejs như chính nó để tôi có thể gỡ lỗi bằng cách sử dụng node-ins Inspector ngay bây giờ. Tôi biết, nó không phải là giải pháp, nhưng nó hoạt động. Tôi nghĩ rằng, trong tương lai, tôi sẽ thêm một lần nữa với tính năng kiểm tra nút và các công cụ / tính năng khác được thêm vào. Cuối cùng nhưng không kém phần quan trọng, nó thật tuyệt vời! Tôi đang sử dụng nó trong các dự án khác và thực sự rất tuyệt!
JuanO

Chỉ cần bắt đầu chơi xung quanh với Grunt, cũng quan tâm đến câu hỏi đó ...
Dmitry Pashkevich

@iancrowther, các công cụ mà trình kiểm tra web sử dụng là trong V8. Có một dự án được gọi là node-inspectornói chuyện với node --debug, cung cấp thông tin gỡ lỗi cho một trình duyệt kết nối. Điều này thật tuyệt vời vì sau đó bạn có thể kết nối Chrome với quy trình kiểm tra nút và sử dụng tất cả các công cụ kiểm tra web để gỡ lỗi ứng dụng của mình. github.com/dannycoates/node-ins Inspector
David Souther

Câu trả lời:


135

Để chạy grunt trong gỡ lỗi, bạn cần chuyển tập lệnh grunt tới nút một cách rõ ràng:

node-debug $(which grunt) task

và đặt một debugger;dòng trong nhiệm vụ của bạn. node-inspectorsau đó sẽ mở một trình duyệt với các công cụ gỡ lỗi.

Chỉnh sửa ngày 28 tháng 2 năm 2014

node-inspectorđã thêm lệnh node-debug, lệnh khởi chạy nút ở --debugtrạng thái và mở trình duyệt đến node-inspectortrang, dừng khi nó chạm vào debuggerdòng đầu tiên hoặc đặt điểm ngắt.

Chỉnh sửa ngày 30 tháng 1 năm 2015

Trên Windows, mọi thứ phức tạp hơn. Xem câu trả lời từ @ ví dụ :luhotorenko để biết hướng dẫn.


1
Điều đó thật tuyệt. Nó cũng hoạt động trên các thùng npm được cài đặt toàn cầu khác.
pllee

1
nút debug $ (mà grunt) sử dụng nhiệm vụ nodejs debugger mặc định
Tomas Romero

3
Tôi đang gặp một chút rắc rối với việc này. Bạn có thể làm rõ những gì $(which grunt)là? Có phải nó chỉ là Gruntfile.js mà tôi muốn gỡ lỗi không? Và để tasktôi đặt (sử dụng servelàm ví dụ) grunt servehay chỉ serve? Tôi đã thử node-debug Gruntfile.js servevà rất nhiều thứ khác nhưng tôi không thể làm cho điều này thành công. Nút thanh tra mở ra và nó bị hỏng ở dòng đầu tiên, nhưng tôi không thể đột nhập vào servenhiệm vụ ngay cả khi tôi đặt một debugger;dòng làm dòng đầu tiên của hàm.
Brett

2
@brett, bạn đang sử dụng windows hay OSX / Linux? Trên unix, $ (mà grunt) được thay thế bằng đường dẫn đầy đủ đến grunt.jstập lệnh grunt-cli . Đó là tập lệnh thực sự chạy Grunt. Nếu bạn đang sử dụng windows, hãy xem stackoverflow.com/a/13443026/240358 (câu trả lời bên dưới phần này) để biết vị trí có thể có của tập lệnh grunt-cli. Đó là mất nơi grunttrong lệnh của bạn - trong ví dụ của bạn, thay thế taskvớiserve
David Souther

Cảm ơn @DavidSouther, bạn có muốn thêm phần dành riêng cho cửa sổ vào câu trả lời của mình không? Tôi thực sự chỉ nên chuyển sang Linux ...
Brett

39

Giải pháp Windows

Chạy

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

từ cmd trong thư mục với của bạn Gruntfile.js. Đừng quên đặt debugger;dòng ở những nơi cần thiết.


3
Bắt đầu với grunt 0,4 điểm vào grunt là một phần của grunt-cligói:node --debug-brk [..]\node_modules\grunt-cli\bin\grunt
mistaecko

4
Cảm ơn bạn rất nhiều về các hướng dẫn Windows. Trong PowerShell bạn có thể sử dụng dấu ngã để thực hiện một này chút ít mong manhnode --debug-brk (Resolve-Path ~\AppData\Roaming\npm\node_modules\grunt-cli\bin\grunt) taskname
George Mauer

Trời ạ, tôi vừa dành 30 phút để tìm ra điều này sau đó cập nhật câu trả lời của mình! Tôi nên chỉ cuộn xuống!
David Souther

1
Đừng quên để mở một giao diện điều khiển và chạynode-inspector
valter.santos.matos

@ valter.santos.matos thực sự là bây giờ bạn nên sử dụng nút - khía cạnh được đề cập bên dưới
Jackie

7

Để gỡ lỗi, chúng tôi phải sửa đổi tệp grunt trong bin. Trên máy tính của tôi, grunt được cài đặt toàn cầu, vì vậy tôi đã truy cập / usr / local / lib / node_modules / grunt / bin, tôi đã mở tệp và sửa đổi:

#!/usr/bin/env node

Đến

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

--debug-brk sẽ ngắt trên dòng đầu tiên của javascript được chạy.

Tuy nhiên, chỉ làm điều đó thôi là chưa đủ, vì bạn sẽ không thể tìm thấy tệp js nhiệm vụ của mình đang grunt trong trình đơn thả xuống trong trình kiểm tra nút, vì vậy bạn phải sửa đổi tệp mà bạn muốn gỡ lỗi bằng cách thêm vào debugger;đâu bạn muốn điểm ngắt xảy ra. Bây giờ bạn có thể nhấp vào tiếp tục sau lần ngắt đầu tiên và bạn sẽ phá vỡ debugger;dòng của mình

Khá kludgy, nhưng đó là cách duy nhất tôi tìm thấy cho đến nay.


2
Điều này cực kỳ khó tin, vì nó dựa trên nhiều hành vi trong / usr / bin / env và phép thuật không có giấy tờ giữa # và \ n trong dòng shebang.
David Souther

2
Nó không làm việc cho tôi. Grunt vẫn chạy mà không có chế độ gỡ lỗi.
Eugene Gluhotorenko

@DavidSouther Shebangs không phải là ma thuật không có giấy tờ. Chúng là hành vi POSIX được tiêu chuẩn hóa
Miles Rout

6

Gần đây, tôi đã tạo grunt-node-ins Inspector để dễ dàng định cấu hình node-ins Inspector với phần còn lại của quy trình làm việc grunt của bạn, hãy kiểm tra: https://github.com/ChrisWren/grunt-node-ins Inspector

Đây là một phần của Gruntfile minh họa cách bạn có thể gỡ lỗi một tác vụ grunt bằng cách sử dụng grunt-node-ins Inspector, grunt-concurrent và grunt-shell: https://github.com/CabinJS/Cabin/blob/master/Gruntfile. js # L44-L77


Bạn đang nghĩ, chạy đại node --debug-brk $(which grunt) node-inspector build testloại? Tôi thích điều đó.
David Souther

Khá nhiều, ngoại trừ tôi sử dụng đồng thời, vì node-inspectorsẽ không thoát và cho phép buildtestchạy vì nó chạy mãi mãi. Tôi đã thêm một liên kết vào một đoạn mã mà tôi đã thiết lập nó.
ChrisWren

Hừ! Suy nghĩ thứ hai ... quy trình làm việc của tôi chỉ bắt đầu node-inspector &, để nó ở chế độ nền và gọi nó là xong. Bất kỳ suy nghĩ của bạn về điều đó?
David Souther

1
Không chắc tại sao, nhưng điều này dường như không hiệu quả với tôi. Tôi chạy lệnh grunt node-inspectorvà sau đó truy cập url localhost và tôi không thấy tệp nguồn nào. Chỉ là công cụ gỡ lỗi trống.
Kris Hollenbeck

Tôi đã quản lý để nguồn hiển thị bằng cách chạy hai lệnh riêng biệt. grunt node-inspectornode --debug-brk Gruntfile.jstừ thư mục grunt của tôi. Tuy nhiên, khi tôi đặt điểm ngắt trong tệp grunt, nó chỉ bị lỗi do kết nối.
Kris Hollenbeck

4

Tôi đã thực hiện một nhiệm vụ để chạy ứng dụng của mình và khởi chạy trình kiểm tra nút. Nó tốt hơn nhiều so với mệnh đề hiện tại, bạn chỉ cần thêm tác vụ này vào 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
Tác giả của grunt-node-ins Inspector đã đúng. Giải pháp này chỉ hoạt động trên môi trường posix trong khi giải pháp này dễ dàng hơn trong việc định cấu hình nút-kiểm tra viên và đồng thời, hoạt động trên posix và cửa sổ.
rainabba 14/1213

3

Câu trả lời tuyệt vời ở đây. Trong năm 2017, bây giờ bạn có thể làm

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

Mà in cái gì như thế.

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

Mở URL đó trong chrome và bạn đã sẵn sàng!

Tôi đang sử dụng Node 7.3.0 và tôi đang sử dụng Mac. Bạn có thể phải làm theo một số lời khuyên trong các bài viết khác để làm cho nó hoạt động trên Windows.


2

Cập nhật năm 2019

  • Nếu bạn muốn khởi chạy tác vụ grunt ở chế độ gỡ lỗi và ngắt ở dòng đầu tiên:

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

  • Nếu bạn muốn khởi chạy tác vụ grunt ở chế độ gỡ lỗi tại một cổng cụ thể:

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

  • nếu bạn muốn gắn VSCODE vào tiến trình nút đang chạy phiên gỡ lỗi của grunt, hãy sử dụng cấu hình sau trong 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
    }
  ]
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.