2014-05-12 12 views
12

Ho una serie di obiettivi per l'esecuzione di gulp.js mio test moka che funzionano come un fascino che attraversa gulp-mocha. Domanda: come faccio a eseguire il debug dei miei test di moka eseguiti attraverso gulp? Vorrei usare qualcosa come node-inspector per impostare i punti di interruzione nei miei file src e test per vedere cosa sta succedendo. Sono già in grado di raggiungere questo chiamando direttamente il nodo:Gulp: obiettivo di eseguire il debug moka test

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

Ma io preferirei un bersaglio sorso che avvolge questo per me, per es .:

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

idee? Voglio evitare uno script bash o qualche altro file separato dal momento che sto cercando di creare un riutilizzabile gulpfile con gli obiettivi che sono utilizzabili da qualcuno che non conosce sorso.

Ecco il mio attuale 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

magari utilizzare childprocess.exec? http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback –

+0

@BrianGlaz che sia una buona idea. L'unico svantaggio è che non si ottiene l'output dal processo fino a quando l'attività non è completa anziché as-you-go. C'è un modo per farlo mentre si ottiene un output progressivo allo stdout? –

+0

Scopri child_process.spawn() http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options. è molto simile ma funge da emettitore di eventi che consente di allegare i callback. Controlla il link per gli esempi. –

risposta

12

Con alcune linee guida da @BrianGlaz Sono venuto con la seguente operazione. Finisce per essere piuttosto semplice. Più esso tubi tutto l'output al genitore stdout quindi non c'è bisogno di gestire manualmente 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

È possibile utilizzare la classe di Node Child Process per eseguire i comandi da riga di comando all'interno di un'applicazione nodo. Nel tuo caso, consiglierei childprocess.spawn(). Esso agisce come un emettitore evento così si può sottoscrivere data per recuperare uscita da stdout. Per quanto riguarda l'utilizzo di questo da all'interno di gulp, è probabile che sia necessario eseguire alcune operazioni per restituire un flusso che può essere reindirizzato a un'altra attività di Gulp.

+0

Immagino tu intenda 'childprocess.spawn()'? –

+1

Haha si, modificato. –

+0

Apprezzo la tua guida, ma non credo di poterla accettare alla fine come risposta corretta poiché non risponde alla domanda: fornire un modo per farlo attraverso un compito ingannevole. –

Problemi correlati