Для тех, кто мигрирует с gulp v3 на v4 или использует gulp.task()
для определения задач в gulp v4 и получения этого сообщения об ошибке: Task never defined
, проблема обычно заключается в следующем:
Прямые ссылки
Прямые ссылки - это когда вы создаете задачи, используя строковые ссылки, которые еще не были зарегистрированы.Это было обычной практикой в старых версиях, но эта функция была удалена для ускорения выполнения задач и содействия использованию именованных функций.В более новых версиях вы получите ошибку с сообщением «Задача не определена», если вы попытаетесь использовать прямые ссылки.Это может возникнуть при попытке использовать экспорт для регистрации задач и составления задач по строке.В этой ситуации используйте именованные функции вместо строковых ссылок.
Во время миграции может потребоваться использование реестра прямых ссылок.Это добавит дополнительное закрытие к каждой ссылке на задачу и значительно замедлит вашу сборку.Не полагайтесь на это исправление очень долго.
Из документации gulpjs re: gulp.series и gulp.parallel документация .
Вот что это значит.Существует два способа создания задач:
1. gulp.task('someStringAsTask', function() {..})
2. function myNamedFunction () {…}
Когда вы используете версию 1 (gulp.task…
), вы не можете ссылаться на эту задачу по ее строковому имени, пока она не будет зарегистрирована.Таким образом, вы не можете сделать это:
exports.sync = gulp.series('sass2css', serve, watch);
// or gulp.task('dev', gulp.series('sass2css', serve, watch); doesn't work either
gulp.task('sass2css', function() {
return gulp.src(paths.sass.stylesFile)
.pipe(sass().on("error", sass.logError))
.pipe(gulp.dest(paths.css.temp))
.pipe(reload({ stream: true }));
})
Результат:
AssertionError [ERR_ASSERTION]: Task never defined: sass2css
Это прямая ссылка, составляющая задачу (используя gulp.series
или gulp.parallel
) и ссылающаяся на задачупо строковому имени (в приведенном выше случае 'sass2css'
) до оно было зарегистрировано.(вызов "gulp.task(…..)
" - это процесс регистрации). Если сначала поставить gulp.task('sass2css',...)
, то это решит проблему.
Если вы используете вторую версию определения задачи:
function sass2css() {
return gulp.src(paths.sass.stylesFile)
.pipe(sass().on("error", sass.logError))
.pipe(gulp.dest(paths.css.temp))
.pipe(reload({ stream: true }));
}
вытеперь используется именованная функция для регистрации задачи и не нужно использовать ее имя в виде строки.Так что теперь это работает:
exports.sync = gulp.series(sass2css, serve, watch);
// gulp.task('dev', gulp.series(sass2css, serve, watch); this also works
с последующим * (или предшествующим - либо работает):
function sass2css() {
return gulp.src(paths.sass.stylesFile)
.pipe(sass().on("error", sass.logError))
.pipe(gulp.dest(paths.css.temp))
.pipe(reload({ stream: true }));
}
Оригинальный OP использовал это, и он работал:
import gulp from 'gulp';
gulp.task('dev', gulp.series('clean');
Заметил, что clean.js
был импортирован раньше, чем dev.js
, так что все в порядке.
Это не сработало:
import gulp from 'gulp';
gulp.task('build', gulp.series('clean');
, потому что ссылка на строкузадача, 'clean'
импортируется (и, следовательно, регистрируется) после build.js
, где на нее ссылаются - таким образом, создается недопустимая прямая ссылка для задачи со ссылками на строки.
Таким образом, существует дваСтандартные способы исправить эту ошибку:
Использование именованных функций для определения задач, отличных от gulp.task('someTask',...)
.Тогда не имеет значения порядок использования этих именованных функций при составлении других задач, т. Е. При использовании gulp.series
или gulp.parallel
.И есть и другие преимущества использования именованных функций, например, передача аргументов, так что это лучший вариант.
Если вы используете более старый метод gulp v3 gulp.task
для создания задач сссылки на строки, будьте осторожны, чтобы не ссылаться на эти задачи до тех пор, пока после задача фактически не будет создана.
Также см. мой ответ на задача никогдаопределенная ошибка для устранения другой проблемы, которая приводит к тому же сообщению об ошибке. В частности, используется gulp.task('someTask', ['anotherTask'], function(){})
synatx в файле gulp4.