Завершится ли gulp.src (). Pipe (). Dest () до следующей строки? Могу ли я вызвать gulp.src (). Pipe (). Dest () несколько раз? - PullRequest
0 голосов
/ 28 октября 2018

Я поддерживаю процесс сборки, который использует gulp, и пытаюсь устранить проблему. Чтобы устранить эту проблему, я хотел бы знать, допустим ли и правильно ли написан код, выполняющий несколько вызовов gulp.src (). Pipe (). Dest () в одной задаче gulp.

Точнее, я хочу знать, завершается ли gulp.src (). Pipe (). Dest () до следующей строки javascript, которая делает еще один вызов gulp.src (). Pipe (). Dest ().

Код будет выглядеть так:

gulp.src(getSrcFiles())
    .pipe(dostuff)
    .pipe(dostuff2)
    .dest('temp');
// will the above copy complete before I try doing substitutions 
gulp.src('temp/**')
    .pipe(mySubstitutions)
    .dest('temp')
gulp.src('temp/**')
    .dest('dist')

Вопрос в том, завершится ли первый конвейер из gulp.src().pipe().pipe().dest() до следующей строки, которая выполняет некоторые подстановки переменных для файлов, скопированных в первый конвейер?

Я не видел ответа в документации глотка по адресу https://gulpjs.org/API.html#gulp-dest-path-options.

Некоторые другие вопросы, которые я нашел, но не отвечали на мой вопрос:

Больше вопросов, но нет ответов ... У меня есть ощущение, что я собираюсь ответить на этот вопрос сам, после того как выясню это, и тогда я смогу ответить на некоторые другие вопросы.

Отличный вопрос и ответ, который поможет мне понять gulp и как он обеспечивает упорядочение заданий: Что делает метод "Done" в Gulp? . Документы по последовательности прогона gulp npm также были очень полезны, см. https://www.npmjs.com/package/run-sequence.

ОБНОВЛЕНИЕ: Я нашел кого-то еще, кто сообщил об этом как о проблеме.

1 Ответ

0 голосов
/ 29 октября 2018

Это ответ, который я искал:

  • Завершит ли gulp.src (). Pipe (). Dest () до следующей строки JavaScript, которая делаетеще один вызов gulp.src (). pipe (). dest (). Нет. Потоковый конвейер запускается, но не обязательно завершается при запуске следующей строки JavaScript.

  • Можете ли вы использовать несколько gulp.src().pipe().dest() в одной задаче gulp? Да, но вы должны написать задачу gulp особым образом, чтобы справиться с этим (показано ниже).

Следующий код показывает, как написать задачу gulp, которая делает несколько копий gulp.src (). Dest ().Это работает так: конвертировать поток gulp.src (). Pipe () в обещание, а затем использовать Promise.all (), чтобы дождаться завершения всех потоков, прежде чем сказать, что задача gulp завершена.

gulp.task('task', function (doneWithTaskCb) {
  return Promise.all([
    new Promise(function(resolve, reject) {
      gulp.src(src + '/*.md')
        .pipe(plugin())
        .on('error', reject)
        .pipe(gulp.dest(dist))
        .on('end', resolve)
    }),
    new Promise(function(resolve, reject) {
      gulp.src(src + '/*.md')
        .pipe(plugin())
        .on('error', reject)
        .pipe(gulp.dest(dist))
        .on('end', resolve)
    })
  ]).then(function () {
    doneWithTaskCb();
  });
});

Я не придумал это.Кредит предоставляется TySound по https://github.com/gulpjs/gulp/issues/1181#issuecomment-126694791.

Важным кодом является следующий шаблон:

new Promise(function(resolve, reject)  {
    gulp.src()
      .pipe()
      .pipe(gulp.dest(dist))
      .end('end', resolve);
}

Этот код создает обещание, что после разрешения конвейер завершается.По сути, он преобразует «поток» в обещание.

Код, который вызывает doneWithTaskCb(), важен, потому что именно так gulp знает, что текущая задача выполнена.

Promise.all( [ new Promise(), new Promise() ] )
    .then(function() { 
        doneWithTaskCb(); 
    });
...