3105


`gulp.task()` を失敗終了するにはどうしたら良いでしょうか？
具体的には外部プロセスが終了コード0以外で終了したときにtaskを失敗させたい（gulpの実行をそこで止めたい）です。

次のようなtaskを想定しています。

[code]

    var spawn = require('child_process').spawn;
    var gulp = require('gulp');
    gulp.task('mytask', function() {
      var proc = spawn('my_command');
      proc.on('exit', function(code, signal) {
        if (code !== null && code !== 0) {
          // ここで gulp task を失敗させたい
        }
      });
    });
    
[/code]


CC BY-SA 3.0
2015-01-05T04:47:40.780
3099
2015-01-05T05:59:31.947
455
question
node.js gulp
gulp の task を失敗させるには?


プラグインであれば`gulp-
util`の`PluginError`を使いますが、タスク内に直接JavaScriptで記述するケースであれば、例外を投げるだけで良いと思います。

[code]

    var spawn = require('child_process').spawn;
    var gulp = require('gulp');
    
    gulp.task('mytask', function() {
      var proc = spawn('ls');
      proc.on('exit', function(code, signal) {
        if (code !== null && code !== 0) {
          throw 'Error!';
        }
      });
    });
    
[/code]

参考まで、[PluginErrorのソースコード](https://github.com/gulpjs/gulp-
util/blob/master/lib/PluginError.js)はこちらです。


CC BY-SA 3.0
2015-01-05T05:29:28.937
3103
2015-01-05T05:38:47.623
2015-01-05T05:38:47.623
390
390
3099
answer


`gulp.task()` に渡す関数の第１引数が非同期処理用のコールバックになっているので、そいつを呼べば抜けるかもしれません。

[code]

    var spawn = require('child_process').spawn;
    var gulp = require('gulp');
    gulp.task('mytask', function(done) {
      var proc = spawn('my_command');
      proc.on('exit', function(code, signal) {
        if (code !== null && code !== 0) {
          done('error'); // タスク失敗。引数が null じゃなければ失敗
        } else {
          done(); // タスク正常終了
        }
      });
    });
    
[/code]

[ドキュメント](https://github.com/gulpjs/gulp/blob/master/docs/recipes/running-
tasks-in-series.md)には

> if ... not null and not undefined, the orchestration will stop

とあります。ただ、注意点として、処理の流れの中で最後に `done` 関数が必ず呼ばれるようにしてください。例外のほうが万能かも。


CC BY-SA 3.0
2015-01-05T05:59:31.947
3105
2015-01-05T05:59:31.947
4978
3099
answer