コードを起動して宛先フォルダーのコピーを S3 バケットにアップロードする前に、vinyl-fs (gulpfs) ストリームを取得してすべての .dest ファイルの書き込みを完了しようとするのはイライラします。そのコピー操作では、ストリームがまだ書き込んでいないディレクトリが欠落し続けます。
問題は、vinly-fs がコールバック/プロミスをどのように処理するかです (そうですか?)。
私は実験のためにいくつかのテストコードをまとめましたが、そのコードが実行されると、.dest コマンドの後、Promise を起動する前に 5 秒間待機するようにストリームを強制したにもかかわらず、Promise はすぐに解決されます (書き込みが開始された後?)。現在、解決関数が起動し、5 秒後にプロンプトに戻ります。これに完全に行き詰まった。vinyl-fs なしで生活したくありませんが、何を試してもうまく再生されないようで、シーケンスとして機能させるにはこれが必要です (アップロードする前にすべてのファイルを書き出します)。
以下は私のテストコードです。これを設定したので、コードをファイルに簡単にダンプし、ソース ディレクトリを設定して、自分で試してみることができます。私はgulpjsの問題とstackoverflowを調べましたが、他の人も同じ問題を抱えていますが、決定的な答え/解決策は見当たりませんでした。
test.js
var source = './builds/**/*.*';
var p = foo(source);
p.then( bar, oopsBar );
//
// vinyl-fs based module task
//
function foo(src) {
var fs = require('vinyl-fs');
var wait = require('gulp-wait')
done = new Promise( function(resolve,reject){
fs.src(src)
.pipe(fs.dest('./temp'))
.pipe(wait(5000))
.on('finish',resolve());
});
// return a promise
return done;
}
function bar() {
console.log('Now uploading to S3 bucket');
}
function oopsBar() {
console.log('Something went wrong');
}
ところで、なぜ私が gulp.task を使用せずにプロミスを返し、別の gulp タスクとしてアップロードを実行しないのか疑問に思われるかもしれません。現在、gulp.tasks を cli 開始タスクに最小化しています。最終的には、このコードを実行するのと同じように、代わりにすごい「ノード テスト」を使用し、グローバルな gulp 依存関係と gulpfile.js をすべて一緒に削除します。Vinyl-fs は素晴らしいモジュールです! しかし、Gulp/Grunt/Brunch/Jake のようなものは買わないほうがよいと判断しました。