私は、フォルダの作成、ファイルのコピー、および複雑化スクリプトの実行を含む複雑なシステムのインストーラとしてgulpを使用しようとしています。
現在私は次のような行動を起こしています。
// Some tasks skipped that set sessionFolder
gulp.task("default", function () {
// Main
runSequence("prepare_comedi", "compile_comedi");
});
gulp.task("prepare_comedi", function () {
// Copies comedi files into build folder
gulp.src(["../comedi/**/*"]).pipe(gulp.dest(sessionFolder));
});
gulp.task("compile_comedi", function () {
var logfile=this.currentTask.name+".log";
gutil.log(gutil.colors.green(this.currentTask.name), ": building and installing COMEDI, logging to "+logfile);
var cmd= new run.Command("{ ./autogen.sh; ./configure; make; make install; depmod -a ; make dev;} > ../"+logfile+ " 2>&1", {cwd:sessionFolder+"/comedi", verbosity:3});
cmd.exec();
});
gulpを実行すると、プロセスはバックグラウンドで開始し、gulpタスクはすぐに終了します。上記の最初のタスクはソースファイルをコピーし、次にタスクをコンパイルします。実際には、2番目のタスクが(ほとんどすぐに)開始すると最初のタスクはコピーの準備ができていないため、2番目のタスクがエラーになります。
2番目のタスクを単独で実行し、最初のタスクからのすべてのファイルをコピーしておくと、問題なく動作しますが、出力は次のようになります。
[19:52:47] Starting "compile_comedi"...
[19:52:47] compile_comedi : building and installing COMEDI, logging to compile_comedi.log
$ { ./autogen.sh; ./configure; make; make install; depmod -a ; make dev;} > ../compile_comedi.log 2>&1
[19:52:47] Finished "compile_comedi" after 6.68 ms
だから6かかります。タスクで指定されたすべてのコンパイルが終了した後にのみgulpがタスクを終了するようにしながら、タスクを終了するのに68ミリ秒かかります。私はそれから依存関係としてこのステップから構築されたバイナリを使用する別のコンパイルプロセスを実行するでしょう。
次のgulpタスクが最初のタスクが外部プロセスの実行を完了した後にのみ開始されるように、どのように外部コマンドを実行することができますか?
回答:
回答№1は2あなたはそのタスクが prepare_comedi
開始前に確定されている compile_comedi
。これを行うには、 prepare
タスク、単にストリームを返す:
gulp.task("prepare_comedi", function () {
// !!! returns the stream. Gulp will not consider the task as done
// until the stream ends.
return gulp.src(["../comedi/**/*"]).pipe(gulp.dest(sessionFolder));
});
これらのタスクは相互依存しており、特定の順序を必要とするため、実際に2つのメソッドを作成してそれらを通常どおりに呼び出すようにコードをリファクタリングすることを検討することもできます。これをみて 注意.
更新
以下のコメントで質問に答えてください。非同期ジョブが完了するまでタスクを保留したい場合は、3つの選択肢があります。
- ストリームを返す(上記の場合)
- 約束が返ってきて、あなたが "終わったときにそれを成し遂げる( Q この例では):
var Q = require("Q");
gulp.task("asyncWithPromise", function() {
var deferred = Q.defer();
// anything asynchronous
setTimeout(function() {
Q.resolve("nice");
}, 5000);
return deferred.promise;
});
- を受け取る
callback
機能とそれを呼び出す
gulp.task("asyncWithPromise", function(done) {
setTimeout(function() {
done();
}, 5000);
});
これらのアプローチは ドキュメント内.