Вопрос:
Я пытаюсь очистить папку перед запуском задач в gulp 4
var gulp = require(‘gulp’); var del = require(‘del’); gulp.task(‘clean’, function() { del.sync(‘folder/*’); }); gulp.task(‘foo’, gulp.series(‘clean’, ‘something’));
Это не работает, потому что задача ‘clean’ должна возвращать некоторый поток. Я нашел обходное решение:
gulp.task(‘clean’, function() { del.sync(‘folder/*’); var emptyStream = gulp.src([]).pipe(gulp.dest(‘/’)); return emptyStream; });
но все же надеемся найти лучшее решение.
Лучший ответ:
gulp позволяет три варианта управления асинхронностью. Во-первых, если функция завершена (возвращает ничего / undefined или простое значение), gulp считает, что задача выполнена и движется дальше. Однако, если ваша задача – асинхронная задача (как много в node), тогда вы…
- Возврат потока. return gulp.src(…).pipe(gulp.dest(…)); обратите внимание, что возвращаемое значение является потоком, поскольку gulp.src и .pipe возвращают потоки.
- Верните Promise.
- Использовать обратный вызов. если вы поместите переменную в аргумент функции, тогда gulp ожидает, что вызов будет вызван и дождитесь, когда это произойдет. Предоставление обратного вызова значение в качестве аргумента считается сбоем, а вызов его без значения считается успешным.
В случае del он не выполняет первые два, а выполняет обратный вызов, который обрабатывает то же, что и в сценарии 3. выше.
gulp.task(‘clean’, function(done) { del([‘output’], done); });
Примеры
Вот пример использования обратного вызова, вызванного вручную с потоком:
gulp.task(‘foo’, function(done) { gulp.src(‘input’) .pipe(gulp.dest(‘output’)) .on(‘end’, function() { done(); }) .on(‘error’, function(err) { done(err); }); });
Поскольку потоки настолько распространены, что один из них сделает это выше. (Обратите внимание, что done был удален, поэтому gulp не ожидает, что он будет вызван).
gulp.task(‘foo’, function() { return gulp.src(‘input’) .pipe(gulp.dest(‘output’)); });
Не все может быть потоком, а обратные вызовы могут быть сложными для управления, поэтому вы можете вместо этого пообещать:
gulp.task(‘foo’, function() { return new Promise(function(resolve) { setTimeout(resolve, 5000); }); }); Ответ №1
вы также можете передать обратный вызов для очистки задачи, чтобы вернуть поток
var del = require(‘del’); gulp.task(‘clean’, function(cb) { del([‘output’], cb); });
посмотрите здесь
Ответ №2
Непосредственно из gulp 4.0 образцов просто верните обещание del:
function clean() { // You can use multiple globbing patterns as you would with `gulp.src`, // for example if you are using del 2.0 or above, return its promise return del([ ‘assets’ ]); }