Gulp 4 - Как генерировать динамические задачи на основе двух массивов - PullRequest
0 голосов
/ 03 июня 2019

Я строю конвейер генерации электронной почты (несколько шаблонов), используя файлы перевода nunjucks и json. Это означает, что мне нужно перебрать несколько шаблонов и файлов перевода, однако я не могу заставить его работать.

Попытка добавить еще один цикл в templates.map (), но это, похоже, не работает (или я делаю это совершенно неправильно, конечно). Это почти работает, но в какой-то момент происходит сбой, генерируя только несколько шаблонов. Первый шаблон работает, но он падает на втором шаблоне:

The following tasks did not complete: <anonymous>
Did you forget to signal async completion?

источник: https://cobwwweb.com/dynamic-tasks-gulp-4

var templates = [];
var languages = ["nl", "en"];

function generateTemplates(done) {
  const tasks = templates.map((template) => {
    return () => {
      const langs = languages.map((lang) => {
        return () =>
          gulp.src(`source/templates/${template}`)
          .pipe(data(function () {
            return require(`./source/translations/${lang}/${template.split('.')[0] }.json`);
          }))
          .pipe(nunjucksRender({
            path: ['source/partials']
          }))
          .pipe(gulp.dest('dist/' + lang));
      });

      return gulp.series(...langs, (seriesDone) => {
        seriesDone();
      })();
    }
  });

  return gulp.series(...tasks, (seriesDone) => {
    seriesDone();
    done();
  })();
}

Я также попытался сгенерировать задачи, используя 2 цикла for, но при этом генерируется только последний шаблон массива из последнего языка в массиве (пример: только en / template2 будет сгенерирован правильно). Я вижу в консоли, что задачи начинаются и заканчиваются, но я их нигде не вижу. Может быть, цикл завершен гораздо быстрее, чем генерация задач? :

var templates = fs.readdirSync('./source/templates');
var languages = ["nl", "en"];

for (var lang of languages) {
  for (var template of templates) {
    gulp.task(`${lang}-${template}`, function (done) {
      return gulp.src(`source/templates/${template}`)
        .pipe(data(function () {
          return require(`./source/translations/${lang}/${template.split('.')[0]}.json`);
        }))
        .pipe(nunjucksRender({
          path: ['source/partials']
        }))
        .pipe(gulp.dest(`dist/${lang}`));
    });
    tasks.push(`${lang}-${template}`);
  }
}

gulp.task('genlang', gulp.series(tasks));

Структура моей папки:

/dist
/source
--/partials
--/templates
   --/template1.html
   --/template2.html
--/translations
   --/en
      --/template1.json
      --/template2.json
   --/nl
      --/template1.json
      --/template2.json

1 Ответ

0 голосов
/ 03 июня 2019

Исправил это сам, мне нужно было сделать несколько cb's в возвратах:

function generateTemplates(done) {
  const tasks = templates.map((template) => {
    return (doneTasks) => {
      const langs = languages.map((lang) => {
        return (doneLanguages) => {
          gulp.src(`source/templates/${template}`)
          .pipe(data(() => require(`./source/translations/${lang}/${template.split('.')[0]}.json`)))
          .pipe(nunjucksRender({
            path: ['source/partials']
          }))
          .pipe(gulp.dest('./dist/' + lang));
          doneLanguages();
        }
      });

      return gulp.parallel(...langs, (seriesDone) => {
        seriesDone();
        doneTasks();
      })();
    };
  });
...