Gulp 4-如何基于两个数组生成动态任务

时间:2019-06-03 09:52:30

标签: gulp gulp-4 gulp-nunjucks-render

我正在使用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 :(得分:0)

我自己解决了这个问题,我需要在退货单中做一些cb的操作:

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();
      })();
    };
  });