【问题标题】:Gulp sequential execution of same task on array of source filesGulp 在源文件数组上顺序执行相同任务
【发布时间】:2019-11-27 19:02:46
【问题描述】:

我的 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 compile 在完整的 JS 文件集上要么因“堆内存不足”错误而崩溃(即使在 16 GB 工作站上使用 --max_old_stack_size=12000 ) 或在较大的 JS 文件(原始大小 10 h)。但是,在示例中的编写方式 gulp seqcompile 仍然不是顺序的,因为输出顺序!=代码中 JS 文件的顺序,并且在我的远程实例上,gulp 仍然无限期运行(在至少我现在在 16 GB 工作站上取得了成功)。

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

【问题讨论】:

  • 尝试用for...of 替换forEach 调用,看看是否得到顺序执行。
  • 我会尽快尝试!
  • 作为测试,我用手写笔文件进行了尝试:for (const file of stylusFiles) {...};,但是手写笔构建的完成顺序仍然与它们在数组 stylusFiles 中指定的顺序不同,所以执行仍然是并发的。
  • 由于没有人能够向我提出解决方案,我想我将不得不在不久的将来放弃 gulp 以使用 webpack 或其他一些解决方案。

标签: javascript functional-programming gulp frontend gulp-uglify


【解决方案1】:

如何强制顺序执行?

你可以尝试使用外部包来强制它。由于您没有提及您使用的是什么类型的包,我只是假设您没有使用 gulp-sequenceWhich is available here.

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

您可以尝试的另一件事是使用命令gulp.series。在Stack Overflow answer.

中可以找到更好的解释

如果能写出类似的东西就好了 gulp.series(javascFiles).

关于这一点,请参考我之前的观点。它已经在之前的 SO question 中描述过。

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

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

另一个你可以用来解决这个问题的方法是this "gulp-once" package,它只传递一次文件,除非被改变。

我希望这会有所帮助。

【讨论】:

  • 我已经在使用 gulp.series,正如你在上面的代码中看到的那样!
  • @MatthiasGralle 是的,但是你检查过我提到的其他包吗?
  • gulp.series 是在 gulp 4 中引入的,以便不需要像 gulp-sequence 这样的修复。尽管如此,因为我真的很想完成这项工作,所以我尝试了 gulp-sequence。它仍然同时运行,而不是按照指定的顺序运行。 const runSequence = require('gulp4-run-sequence'); gulp.task("seqcompile2", function(done) { setVersion(); global.stopOnError = true; runSequence("production", "stylus","firstcompile","secondcompile", done ); });
  • 我没有看到 gulp-once 与我的问题的相关性。
  • 最后,我得到的印象是 gulp 不会做我想做的事,除非(也许!)我完全重写我的 gulp 文件,在这种情况下,我更喜欢迁移到 webpack 之类的东西.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-15
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
相关资源
最近更新 更多