Проблемы с выполнением асинхронных задач в Gulp

#node.js #gulp

#node.js #gulp

Вопрос:

У меня минимальный опыт работы с Node.js проекты и унаследовали тот, который использует Gulp для создания и распространения самого себя.

В проекте есть несколько разрозненных файлов задач, и a gulpfile.js , который ссылается на них все. Для краткости я буду использовать наименьшую функцию в качестве примера.

 //gulpfile.js
...
gulp.task('csscompile', function() {        
  gulp.src('./src/ops/gulp/csscompile.js')
});
...


//csscompile.js
...
module.exports = function (gulp) {

  gulp.task('csscompile', function (done) {

    let paths = [
      'src/app/**/*.scss',
      'node_modules/angular-material/angular-material.scss',
    ];

    gulp.src(paths)
      .pipe(sass())
      .pipe(concat('app.css'))
      .pipe(gulp.dest('build'))
      .done();
  });
};
  

Запуск $ gulp csscompile из командной строки всегда завершает всю функцию примерно за 10 мс, и я получаю вывод, подобный:

 [10:44:43] The following tasks did not complete: csscompile
[10:44:43] Did you forget to signal async completion?
  

Очевидно, что существует проблема с ожиданием завершения функций. После поиска я перепробовал все мыслимые комбинации использования async флагов, использования function (done) и многого другого, но безрезультатно. Даже помещение csscompile функции непосредственно в csscompile задачу не работает.

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

Есть ли у кого-нибудь какие-либо рекомендации по изменениям, которые я могу внести?

Комментарии:

1. Вы тоже ввели возврат в gulp.task('csscompile', function() { return gulp.src('./src/ops/gulp/csscompile.js') }); функцию? Это может быть проблемой.

Ответ №1:

Согласно документам:

Когда вы видите сообщение «Вы забыли сообщить об асинхронном завершении?» предупреждение, ни один из методов, упомянутых выше, не использовался. Для решения проблемы вам нужно будет использовать обратный вызов с ошибкой или вернуть поток, обещание, отправитель события, дочерний процесс или наблюдаемый.

Итак, вам нужно вернуть поток.

Это должно сработать:

 module.exports = function (gulp) {

  gulp.task('csscompile', function () {

    let paths = [
      'src/app/**/*.scss',
      'node_modules/angular-material/angular-material.scss',
    ];

    return gulp.src(paths)
      .pipe(sass())
      .pipe(concat('app.css'))
      .pipe(gulp.dest('build'));
  });
  

Комментарии:

1. Спасибо за эту ссылку. Я попробовал ваше предложение вернуть поток, но я все еще получаю сообщение «Вы забыли …?». Может ли это быть проблемой с тем, как я определяю задачу в gulpfile.js ?

2. Да, это так. На данный момент это путь в никуда. Позвольте мне погуглить.

3. Какую версию gulp вы используете?

4. v4.0.2. Из того, что я могу сказать, все это было построено ~ v3.9.

5. Между Gulp 3 и 4 произошли критические изменения, требующие изменений: joezimjs.com/javascript/complete-guide-upgrading-gulp-4 Вам придется использовать Gulp 3 или переписать, чтобы использовать Gulp 4.