2014-05-12 10 views
12

Tôi có một bộ mục tiêu gulp.js để chạy thử nghiệm mocha hoạt động như một nét duyên dáng chạy qua gulp-mocha. Câu hỏi: làm thế nào để gỡ lỗi các bài kiểm tra mocha của tôi chạy qua gulp? Tôi muốn sử dụng một cái gì đó như node-inspector để thiết lập điểm break trong src của tôi và kiểm tra các tập tin để xem những gì đang xảy ra. Tôi đã có thể thực hiện điều này bằng cách gọi trực tiếp nút:Gulp: nhắm mục tiêu để gỡ lỗi các kiểm tra mocha

node --debug-brk node_modules/gulp/bin/gulp.js test 

Nhưng tôi muốn một mục tiêu ngụm mà kết thúc tốt đẹp này đối với tôi, ví dụ .:

gulp.task('test-debug', 'Run unit tests in debug mode', function (cb) { 
    // todo? 
}); 

Ý tưởng? Tôi muốn tránh một tập lệnh bash hoặc một số tệp riêng biệt khác vì tôi đang cố gắng tạo lại gulpfile có thể sử dụng lại với các mục tiêu có thể sử dụng được bởi một người không biết gulp.

Đây là hiện gulpfile.js

// gulpfile.js 
var gulp = require('gulp'), 
    mocha = require('gulp-mocha'), 
    gutil = require('gulp-util'), 
    help = require('gulp-help'); 

help(gulp); // add help messages to targets 

var exitCode = 0; 

// kill process on failure 
process.on('exit', function() { 
    process.nextTick(function() { 
    var msg = "gulp '" + gulp.seq + "' failed"; 
    console.log(gutil.colors.red(msg)); 
    process.exit(exitCode); 
    }); 
}); 

function testErrorHandler(err) { 
    gutil.beep(); 
    gutil.log(err.message); 
    exitCode = 1; 
} 

gulp.task('test', 'Run unit tests and exit on failure', function() { 
    return gulp.src('./lib/*/test/**/*.js') 
    .pipe(mocha({ 
     reporter: 'dot' 
    })) 
    .on('error', function (err) { 
     testErrorHandler(err); 
     process.emit('exit'); 
    }); 
}); 

gulp.task('test-watch', 'Run unit tests', function (cb) { 
    return gulp.src('./lib/*/test/**/*.js') 
    .pipe(mocha({ 
     reporter: 'min', 
     G: true 
    })) 
    .on('error', testErrorHandler); 
}); 

gulp.task('watch', 'Watch files and run tests on change', function() { 
    gulp.watch('./lib/**/*.js', ['test-watch']); 
}); 
+0

có thể sử dụng childprocess.exec? http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback –

+0

@BrianGlaz đó là một ý tưởng hay. Nhược điểm duy nhất là bạn không nhận được đầu ra từ quá trình cho đến khi nhiệm vụ được hoàn thành thay vì khi bạn đi. Có cách nào để làm điều này trong khi nhận được sản lượng tiến bộ để stdout? –

+0

Khám phá child_process.spawn() http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options. nó rất giống nhưng hoạt động như một bộ phát sự kiện cho phép bạn đính kèm các cuộc gọi lại. Kiểm tra liên kết để biết ví dụ. –

Trả lời

12

Với một số hướng dẫn từ @BrianGlaz, tôi đã đưa ra công việc sau. Kết thúc khá đơn giản. Thêm vào đó nó Ống tất cả các đầu ra của cha mẹ stdout vì vậy tôi không cần phải xử lý bằng tay stdout.on:

// Run all unit tests in debug mode 
    gulp.task('test-debug', function() { 
    var spawn = require('child_process').spawn; 
    spawn('node', [ 
     '--debug-brk', 
     path.join(__dirname, 'node_modules/gulp/bin/gulp.js'), 
     'test' 
    ], { stdio: 'inherit' }); 
    }); 
4

Bạn có thể sử dụng lớp Child Process Node để chạy các lệnh dòng lệnh từ bên trong một ứng dụng nút của tôi. Trong trường hợp của bạn, tôi sẽ giới thiệu childprocess.spawn(). Nó hoạt động như bộ phát sự kiện để bạn có thể đăng ký data để truy xuất đầu ra từ stdout. Về việc sử dụng điều này từ bên trong gulp, một số công việc có thể sẽ cần phải được thực hiện để trả về một luồng có thể được chuyển đến một nhiệm vụ gulp khác.

+0

Tôi giả sử bạn có nghĩa là 'childprocess.spawn()'? –

+1

Haha có, đã chỉnh sửa. –

+0

Tôi đánh giá cao sự hướng dẫn của bạn nhưng tôi không cảm thấy như tôi cuối cùng có thể chấp nhận điều này như là câu trả lời đúng vì nó không trả lời câu hỏi: cung cấp một cách để làm điều này thông qua một nhiệm vụ gulp. –

Các vấn đề liên quan