2014-05-12 18 views
12

मेरे पास gulp.js का सेट है जो मेरे मोचा परीक्षण चलाने के लिए है जो gulp-mocha के माध्यम से चल रहे आकर्षण की तरह काम करता है। प्रश्न: मैं अपने मोचा परीक्षणों को गलप के माध्यम से कैसे चला सकता हूं? मैं क्या देख रहा हूं यह देखने के लिए कि मेरे स्रोत और परीक्षण फ़ाइलों में ब्रेक पॉइंट सेट करने के लिए node-inspector जैसे कुछ उपयोग करना चाहूंगा। मैं पहले से ही नोड सीधे फोन करके यह पूरा करने में सक्षम हूँ:गुलप: मोचा परीक्षण डीबग करने का लक्ष्य

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

लेकिन मैं एक घूंट लक्ष्य है कि मेरे लिए यह लपेटता, उदा .:

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

विचार पसंद करते हैं? मैं bash स्क्रिप्ट या किसी अन्य अलग फ़ाइल से बचना चाहता हूं क्योंकि मैं एक पुन: प्रयोज्य gulpfile को उन लक्ष्यों के साथ उपयोग करने की कोशिश कर रहा हूं जो किसी ऐसे व्यक्ति द्वारा प्रयोग योग्य हैं जो गल्प को नहीं जानता है।

यहाँ है मेरे वर्तमान 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

शायद childprocess.exec का उपयोग करें? http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback –

+0

@ ब्रायनग्लज़ यह एक अच्छा विचार है। एकमात्र नकारात्मकता यह है कि जब तक आप कार्य के बिना काम पूरा नहीं कर लेते हैं तब तक आपको प्रक्रिया से आउटपुट नहीं मिलता है। क्या स्टडआउट पर प्रगतिशील आउटपुट प्राप्त करते समय ऐसा करने का कोई तरीका है? –

+0

child_process.spawn() http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options देखें। यह बहुत समान है लेकिन कॉलबैक संलग्न करने के लिए एक इवेंट एमिटर के रूप में कार्य करता है। उदाहरण के लिए लिंक देखें। –

उत्तर

12

@BrianGlaz से कुछ मार्गदर्शन के साथ मैं निम्नलिखित कार्य के साथ आया था। बल्कि सरल होने के समाप्त होता है। साथ ही यह पाइप के लिए सभी उत्पादन माता पिता की stdout तो मैं मैन्युअल 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

आप कमांड लाइन एक नोड अनुप्रयोग के भीतर से कमांड को चलाने के लिए नोड के Child Process वर्ग का उपयोग कर सकते हैं। आपके मामले में मैं childprocess.spawn() की अनुशंसा करता हूं। यह एक इवेंट एमिटर के रूप में कार्य करता है ताकि आप stdout से आउटपुट पुनर्प्राप्त करने के लिए data पर सब्सक्राइब कर सकें। गल्प के भीतर से इसका उपयोग करने के मामले में, कुछ काम संभवतः एक स्ट्रीम को वापस करने के लिए किया जाना चाहिए जिसे किसी अन्य गल्प कार्य में पाइप किया जा सके।

+0

मुझे लगता है कि आपका मतलब है 'childprocess.spawn() '? –

+1

हाहा हां, संपादित। –

+0

मैं आपके मार्गदर्शन की सराहना करता हूं लेकिन मुझे ऐसा नहीं लगता कि मैं अंततः इसे सही उत्तर के रूप में स्वीकार कर सकता हूं क्योंकि यह प्रश्न का उत्तर नहीं देता है: एक गल्प कार्य के माध्यम से ऐसा करने का एक तरीका प्रदान करना। –

संबंधित मुद्दे