0

コードを起動して宛先フォルダーのコピーを 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 のようなものは買わないほうがよいと判断しました。

4

1 に答える 1

4

欲しかったようです

.on('finish', resolve)

resolve()すぐに電話する代わりに。また、読み取り可能なストリームは event を発行せず、eventfinish発行するため、使用する必要がありますend

.on('end', resolve)
于 2015-12-16T02:57:44.523 に答える