8

我有一个生成连接 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/'));
});

我考虑在最后两个步骤中使用惰性管道,所以如果有文件,我只运行 concat 和 dest,但我不知道如何:

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

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

有人以前做过这个或有任何关于从哪里开始的提示吗?

4

3 回答 3

3

moettinger 答案中的代码(在撰写本文时)不正确。这是要返回的流:

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执行,因为它找不到文件。

文档给出了一个类似的例子

于 2015-10-01T16:34:32.983 回答
1

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

   gulp.task('scripts', function() {
   return gulp.src('src/**/*.js')
      .pipe(newer('app.js'))
      .pipe(concat('app.js'))
      .pipe(gulp.dest('build/'));
});
于 2014-07-28T15:16:02.047 回答
0

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

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

于 2015-10-01T12:36:45.420 回答