首页 > 解决方案 > Gulp 在源文件数组上顺序执行相同任务

问题描述

我的 gulp 文件的简化版本如下所示:

stylusFiles=[...];

gulp.task("stylus", function(done){
  global.stopOnError = true;
  stylusFiles.forEach((file) => {
    executeStylus(file.name, file.src, Date.now());
  });
  done();
});

javascFiles = [firstjs, secondjs];

gulp.task("firstcompile", function (done) {
  createBundle(firstjs);
  done();
});

gulp.task("secondcompile", function (done) {
  createBundle(secondjs);
  done();
});

gulp.task("compile", function(done) {
  setVersion();
  global.stopOnError = true;
  stylusFiles.forEach((file) => {
    executeStylus(file.name, file.src, Date.now());
  });

  createBundles(javascFiles);
  done();
});

gulp.task("seqcompile",
  gulp.parallel("stylus",
  gulp.series("firstcompile","secondcompile"), 
  function(done) {
    setVersion();
    global.stopOnError = true;
    done();
  }
));

手写笔编译以并发方式工作(输出顺序!= 代码中手写笔文件的顺序)。如果我在任何单个 JS 文件上运行 gulp,它就可以工作。我尝试强制顺序执行的原因是gulp 编译在全套 JS 文件上要么因“堆内存不足”错误而崩溃(即使在 16 GB 工作站上使用 --max_old_stack_size=12000)或无限期运行(>10 h) 在较大的 JS 文件上(原始大小 <=24 MB)。但是,在示例中的编写方式,gulp seqcompile仍然不是顺序的,因为输出顺序!= 代码中 JS 文件的顺序,并且在我的远程实例上,gulp 仍然无限期运行(至少我现在已经成功16 GB 工作站)。

  1. 如何强制顺序执行?
  2. 能写出类似的东西就好了gulp.series(javascFiles)
  3. 我不确定 setVersion在stylus 和 js 编译之前是否只运行一次,因为它应该。

标签: javascriptfunctional-programminggulpfrontendgulp-uglify

解决方案


如何强制顺序执行?

那么你可以尝试使用外部包来强制它。由于您没有提及您使用的是什么类型的包,我只是假设您没有使用gulp-sequence. 可以在这里找到。

这个包直接允许你编写gulp.task('sequence-1', gulpSequence(['a', 'b'], 'c', ['d', 'e'], 'f'))可以顺序运行的任务。

您可以尝试的另一件事是使用命令gulp.series。可以在此Stack Overflow 答案中找到更好的解释。

能够编写类似 gulp.series(javascFiles) 的东西会很好。

确切地说,请参考我之前的观点。它已经在之前的 SO question 中描述过。

我不确定 setVersion 在 stylus 和 js 编译之前是否只运行一次,因为它应该。

只运行一次的 gulp 任务通常表明 gulp 无法确定它是否已完成第一次,因此 gulp 不会再次运行它。

你可以用来解决这个问题的另一件事是这个“gulp-once”包,它只通过文件一次,除非改变。

我希望这有帮助。


推荐阅读