Gulp4.«AssertionError: Task никогда не определяется» при вызове или импорте задач - PullRequest
0 голосов
/ 24 мая 2018

Ниже вы можете увидеть упрощенный вид проблемы.В принципе, я могу вызвать task1.js , используя gulp.series в задачах task2,3.js , но как только я добавлю тот же код для вызова task1.js in task4.js - Task never defined: task1 выдается ошибка.В папке задач есть больше задач, чем в примере структуры файла ниже.

У меня есть три задачи,

...
/tasks
   build.js
   clean.js
   dev.js
gulpfile.babel.js
...

все они требуются в gulpfile.babel.js с использованием пакета require-dir

import requireDir from 'require-dir';
requireDir('./tasks', {recurse: true});

Это позволяет мне вызывать задачу из clean.js в dev.js , и она отлично работает.

import gulp from 'gulp';
gulp.task('dev', gulp.series('clean');

Но после того, как я добавлю ту же структуру кода в build.js .

import gulp from 'gulp';
gulp.task('build', gulp.series('clean');

это каким-то образом прерывает поток gulp (я полагаю), поэтому теперь при любом вызове задачи я получаю:
$ gulp dev
-AssertionError [ERR_ASSERTION]: Задача не определена: clean .


$ gulp -v

[11:50:11] CLI version 2.0.1
[11:50:11] Local version 4.0.0

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

У меня была похожая установка, в которой я рекурсивно require выполнял все задачи в каталоге.И после обновления до gulp 4 начала появляться ошибка Задача не определена .

Я попробовал решение Pedro, но это вызвало еще одну ошибку:

The following tasks did not complete: default
Did you forget to signal async completion?

Решение было довольно простымдля меня просто импортируйте отсутствующие задачи.

import gulp from 'gulp';
import './clean';

gulp.task('build', gulp.series('clean'));
0 голосов
/ 01 марта 2019

Для тех, кто мигрирует с 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, где на нее ссылаются - таким образом, создается недопустимая прямая ссылка для задачи со ссылками на строки.

Таким образом, существует дваСтандартные способы исправить эту ошибку:

  1. Использование именованных функций для определения задач, отличных от gulp.task('someTask',...).Тогда не имеет значения порядок использования этих именованных функций при составлении других задач, т. Е. При использовании gulp.series или gulp.parallel.И есть и другие преимущества использования именованных функций, например, передача аргументов, так что это лучший вариант.

  2. Если вы используете более старый метод gulp v3 gulp.task для создания задач сссылки на строки, будьте осторожны, чтобы не ссылаться на эти задачи до тех пор, пока после задача фактически не будет создана.

Также см. мой ответ на задача никогдаопределенная ошибка для устранения другой проблемы, которая приводит к тому же сообщению об ошибке. В частности, используется gulp.task('someTask', ['anotherTask'], function(){}) synatx в файле gulp4.

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

Функции series и parallel в gulp 4 не создают определение задачи, как кажется из ее README , но вместо этого они обе запускают задачи в параметре.Чтобы работать по назначению, нужно окружить вызов закрытием.

Итак, чтобы исправить отрывок

gulp.task('build', gulp.series('clean'));

, необходимо добавить закрытие:

// Older EcmaScripts:
gulp.task('build', function() { return gulp.series('clean') });

// EcmaScript 6:
gulp.task('build', () => gulp.series('clean'));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...