Gulp 任务流管道仅在源文件更改时进行合并拼接

8
我有一个Gulp任务,用于生成合并后的JS文件。我正在使用watch函数检测项目中所有文件的更改,并希望concat任务仅在自上次执行以来源文件发生更改时重新合并文件。
注意:我可以使用更具体的watch命令,但在我真实的产品案例中,我们正在从多个源JS文件组合中生成多个合并的JS文件,因此为每个文件创建监视和任务要复杂得多。
类似这样:
gulp.task('scripts', function() {
   return gulp.src('src/**/*.js')
      .pipe(cache('scripts'))
      // If no changed files in pipeline, exit pipeline, 
      // else add in all src files again
      .pipe(concat('app.js'))
      .pipe(gulp.dest('build/'));
});

我考虑使用lazypipe来处理最后两个步骤,以便只有在有文件时才运行concat和dest,但我不知道如何:

  • 根据管道中是否还有任何文件(在cache()之后)运行条件
  • 重新获取所有源文件(基本上再次发出gulp.src()以重新启动流)

我知道可以在第二部分中使用gulp-remember,但在我的实际生产案例中,如果可能的话,重建流会更加清晰。

有没有人在此之前做过这个或者有任何提示从哪里开始?


你看过 gulp-changed 吗? - Josh Clayton
@JoshClayton 我已经检查了gulp-changed,看起来它在这个问题上的行为与gulp-cached相同(即只会通过需要处理的输入文件流)。我认为它并不能解决退出或重新添加所有源文件的问题。 - Allen
3个回答

3

moettinger's answer (at the time of writing) 中的代码是不正确的。这里是应该返回的流:

return gulp.src('src/**/*.js')
   .pipe(newer('build/app.js'))
   .pipe(concat('app.js'))
   .pipe(gulp.dest('build/'));

当针对单个目标进行测试时,newer()调用必须传递一个相对于当前目录(或绝对路径)的路径。它不能是要根据gulp.dest()中给定的路径解释的路径。使用调用newer('app.js')newer调用将始终导致concat执行,因为它找不到该文件。 文档提供了类似的示例

1

这个插件 gulp-newer 应该能解决问题。

   gulp.task('scripts', function() {
   return gulp.src('src/**/*.js')
      .pipe(newer('app.js'))
      .pipe(concat('app.js'))
      .pipe(gulp.dest('build/'));
});

0

虽然这是一个老问题,但我想补充一下关于gulp-newer的信息。Gulp-newer基于文件的时间戳检测更改,如果文件被删除,gulp-newer不会检测到此更改。

因此,我正在考虑走缓存路线而不是新建路线,因为如果其中一个CSS文件被删除或更改,我需要生成我的主要合并文件,但gulp newer不支持所有这些功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接