2015-09-05 2 views
1

Я написал такой скрипт gulp.В Gulp child_process не может выполнить JS-программу, сгенерированную предыдущим шагом

Короче говоря, делает этот сценарий:

  1. Clean (удалить) программу JS
  2. Построить программу JS
  3. Выполнить программу JS

Этот сценарий иногда (не всегда) не удается, но почему?

var gulp = require('gulp'), 
    babel = require('gulp-babel'), 
    rename = require('gulp-rename'), 
    concat = require('gulp-concat'); 

var runSequence = require('run-sequence'), 
    del = require('del'), 
    exec = require('child_process').exec; 

gulp.task('build', function() { 
    gulp.src('*.es') 
     .pipe(babel()) 
     .pipe(rename({extname: '.js'})) 
     .pipe(gulp.dest('./dist')) 
     .pipe(concat('app.js')) 
     .pipe(gulp.dest('./dist')); 
}); 

gulp.task('clean', function() { 
    del(['dist']); 
}); 

gulp.task('exec', function (cb) { 
    exec('node dist/app.js', function (err, stdout, stderr) { 
     console.log(stdout); 
     console.log(stderr); 
     cb(err); 
    }); 
}); 

gulp.task('default', function (cb) { 
    runSequence('clean', 'build', 'exec', cb); 
}); 

Сообщения об ошибках следуют:

[email protected]:~/***/***% gulp 
[15:17:15] Using gulpfile ~/***/***/gulpfile.js 
[15:17:15] Starting 'default'... 
[15:17:15] Starting 'clean'... 
[15:17:15] Finished 'clean' after 4.28 ms 
[15:17:15] Starting 'build'... 
[15:17:15] Finished 'build' after 12 ms 
[15:17:15] Starting 'exec'... 

module.js:338 
    throw err; 
     ^
Error: Cannot find module '/***/***/dist/app.js' 
    at Function.Module._resolveFilename (module.js:336:15) 
    at Function.Module._load (module.js:278:25) 
    at Function.Module.runMain (module.js:501:10) 
    at startup (node.js:129:16) 
    at node.js:814:3 

[15:17:15] 'exec' errored after 119 ms 
[15:17:15] Error: Command failed: /bin/sh -c node dist/app.js 
module.js:338 
    throw err; 
     ^
Error: Cannot find module '/***/***/dist/app.js' 
    at Function.Module._resolveFilename (module.js:336:15) 
    at Function.Module._load (module.js:278:25) 
    at Function.Module.runMain (module.js:501:10) 
    at startup (node.js:129:16) 
    at node.js:814:3 

    at ChildProcess.exithandler (child_process.js:751:12) 
    at ChildProcess.emit (events.js:110:17) 
    at maybeClose (child_process.js:1015:16) 
    at Socket.<anonymous> (child_process.js:1183:11) 
    at Socket.emit (events.js:107:17) 
    at Pipe.close (net.js:485:12) 
[15:17:15] 'default' errored after 142 ms 
[15:17:15] Error: Command failed: /bin/sh -c node dist/app.js 
module.js:338 
    throw err; 
     ^
Error: Cannot find module '/***/***/dist/app.js' 
    at Function.Module._resolveFilename (module.js:336:15) 
    at Function.Module._load (module.js:278:25) 
    at Function.Module.runMain (module.js:501:10) 
    at startup (node.js:129:16) 
    at node.js:814:3 

    at ChildProcess.exithandler (child_process.js:751:12) 
    at ChildProcess.emit (events.js:110:17) 
    at maybeClose (child_process.js:1015:16) 
    at Socket.<anonymous> (child_process.js:1183:11) 
    at Socket.emit (events.js:107:17) 
    at Pipe.close (net.js:485:12) 

Как ни странно, работает "Глоток Exec" снова удастся.

ответ

0

Вы должны вернуть потоки вы работаете с в ваших задачах, так что Глоток есть способ, чтобы знать, когда задачи закончены:

var gulp = require('gulp'), 
    babel = require('gulp-babel'), 
    rename = require('gulp-rename'), 
    concat = require('gulp-concat'); 

var runSequence = require('run-sequence'), 
    del = require('del'), 
    exec = require('child_process').exec; 

gulp.task('build', function() { 
    return gulp.src('*.es') 
     .pipe(babel()) 
     .pipe(rename({extname: '.js'})) 
     .pipe(gulp.dest('./dist')) 
     .pipe(concat('app.js')) 
     .pipe(gulp.dest('./dist')); 
}); 

gulp.task('clean', function() { 
    return del(['dist']); 
}); 

gulp.task('exec', function (cb) { 
    exec('node dist/app.js', function (err, stdout, stderr) { 
     console.log(stdout); 
     console.log(stderr); 
     cb(err); 
    }); 
}); 

gulp.task('default', function (cb) { 
    runSequence('clean', 'build', 'exec', cb); 
}); 
+0

Спасибо вам большое! Ваш совет отлично решил вышеупомянутый вопрос. – siburu

Смежные вопросы