Gulp任务管道只有在源文件发生变化时才会连接

时间:2014-07-16 14:39:11

标签: gulp gulp-watch

我有一个生成串联JS文件的gulp任务。我使用手表来检测项目中所有文件的更改,并希望concat任务只在源文件自上次执行后发生更改时才重新连接文件。

注意:我可以使用更具体的监视命令,但在我的实际生产情况下,我们从多个源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如果有文件,但我不知道如何:

  • 根据管道中是否还有任何文件(在缓存()
  • 之后)运行条件
  • 带回所有源文件(基本上重新发布gulp.src()再次重新发送流)

我知道我可以使用gulp-remember用于第二部分,但在我的生产情况下,如果可能的话,重建流将更加清晰。

之前有人这样做过,或者有任何关于从哪里开始的提示?

3 个答案:

答案 0 :(得分: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执行,因为它无法找到该文件。

documentation提供了类似的example

答案 1 :(得分:1)

插件gulp-newer应该可以解决问题。

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

答案 2 :(得分:0)

虽然这是一个老问题,但我认为我只会添加更新的信息。 Gulp-newer根据文件的时间戳检测更改,如果删除了文件,则gulp-newer不会选择此更改。

由于这个原因,我正在寻找缓存路线,而不是更新,因为如果其中一个css文件被删除或更改,我需要生成主要的连接文件,但gulp newer不支持所有这些。