При выполнении задач gulp в последовательности выдается ошибка «Необработанный поток в канале» - PullRequest
6 голосов
/ 13 марта 2019

У меня есть следующая задача gulp:

gulp.task('build-files, function(cb) {
    runSequence('run-build-cmd',
        'delete-dest', 'copy-files',
        cb);
});

Эта задача выполняется всякий раз, когда что-либо изменяется в исходной папке следующим образом:

gulp.watch(pathToSrcFolder, ['build-files']);

Так что эта задача запускает 3 других gulpзадач в указанном порядке, первая выполняет команду сборки, вторая удаляет папку следующим образом:

gulp.task('delete-dest', (cb) => {
    del([pathToDestFolder], {force: true});
    cb();
});

, а третья копирует файлы из источника в два места назначения:

gulp.task('copy-files', () => {
    return gulp.src(pathToSrcFolder)
        .pipe(gulp.dest(pathToDestFolder))
        .pipe(gulp.dest(anotherPath));
});

Обратите внимание, что pathToDestFolder является одной и той же папкой в ​​командах delete-source и copy-files.

Проблема, с которой я столкнулся при выполнении этой последовательности, заключается в следующем:

internal/streams/legacy.js:59
      throw er; // Unhandled stream error in pipe.
      ^

Error: ENOENT: no such file or directory, chmod 'pathToDestFolder\path\to\some\file\file.ext'

Я не знаю, почему я получаю эту ошибку.

И когда я запускаю приглашение gulp delete-dest в cmd (которое очистит pathToDestFolder), а затем gulp copy-files (которое скопируетисходная папка на две папки pathToDestFolder и anotherPath) работает как положено.

Итак, я думаю, runSequence не работает должным образом?если да, как я могу решить эту проблему?

Редактировать:

Я пытался использовать rimraf вместо del, и все, кажется, работает просто отлично, я знаю, что rimrafограничен, и вместо него лучше использовать del, но почему del в этом случае приводит к исключению?

Редактировать 2:

Вместо использования rimraf в качестве решения, Я пробовал это решение:

gulp.task('delete-dest', (cb) => {
    del([pathToDestFolder], {force: true})
    .then(paths => {cb();});
});

И оно работало как волшебство.

Почему это работало вместо этого?Я не знаю !

Если кто-то может прояснить ситуацию, я был бы очень благодарен.

1 Ответ

6 голосов
/ 15 марта 2019

Если вы посмотрите здесь , вы обнаружите, что del возвращает обещание.Это асинхронный метод.

В вашем коде вы вызываете cb() сразу после вызова del(...), , но до того, как del фактически завершит удаление каталога.

Вот почему вы должны выполнить обратный вызов после объединения в цепочку then:

gulp.task('delete-dest', (cb) => {
    del([pathToDestFolder], {force: true})
    .then(paths => {cb();});
});

И тогда ваши операции будут выполняться в правильном порядке.

Ошибка, которую вы получили раньше, эторезультат выполнения вещей в странном порядке, приводящий к странному поведению.Gulp пытается скопировать в каталог, когда файловая система удаляет его, и этот конфликт приводит к ошибке файловой системы.


В качестве эксперимента вы можете попробовать запустить синхронную версию delвот так:

gulp.task('delete-dest', (cb) => {
    del.sync([pathToDestFolder], {force: true});
    cb();
});

Посмотрите, работает ли это (хотя вы должны предпочесть асинхронную версию).


В качестве примечания, если только это не является особенностью Gulp 4, хотя, вероятно,нет, вместо вызова обратного вызова в вашей задаче, вы можете просто вернуть обещание следующим образом:

gulp.task('delete-dest', () => {
    return del([pathToDestFolder], {force: true});
});

Это сообщит Gulp, что ваша задача завершена, и она может перейти к следующей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...