在Gulp中,如果多个文件中的任何一个更新,我如何只在一个文件上运行任务?

时间:2014-06-10 11:50:47

标签: gulp

我可能试图让gulp做一些不是惯用的事情,但是这里有。 我希望我的构建任务只在源文件比输出文件更新时运行。

在gulp中,似乎标准做法是创建始终运行的构建任务,然后设置监视任务以仅在某些文件更改时运行该构建任务。没关系,但这意味着你总是在第一次运行时构建。

那么,有可能做我想要的吗?这是我到目前为止所获得的(更新的是更新的):

gulp.task('build_lib', function() {

return gulp.src(["app/**/*.ts"])
    .pipe(newer("out/outputLib.js")) //are any of these files newer than the output?

 ** NEED SOMETHING HERE **
   how do I say, "If I got _any_ files from the step before, replace all of them with a single hardcoded file "app/scripts/LibSource.ts" "?

    .pipe(typescript({
        declaration: true,
        sourcemap: true,
        emitError: false,
        safe: true,
        target: "ES5",
        out: "outputLib.js"
    }))
    .pipe(gulp.dest('out/'))

});

我尝试使用gulpif,但如果没有文件进入它,它似乎无法工作。

    .pipe(gulpif(are_there_any_files_at_all,
        gulp.src(["app/scripts/LibSource.ts"])))

然而,我的条件函数甚至没有被调用,因为没有文件可以调用它。 gulpif在这种情况下调用truthy流,因此LibSource被添加到我的流中,这不是我想要的。

也许在单个流中完成所有这些操作并不是正确的通话,因为我将这些文件通过" gulp-newer" filter是为了查看它们中是否有更新的。我然后丢弃它们并用另一个文件替换它们。我的问题仍然存在。

4 个答案:

答案 0 :(得分:6)

你可以编写自己的through / transform流来处理这样的条件:

// Additional core libs needed below
var path = require('path');
var fs = require('fs');
// Additional npm libs
var newer = require('gulp-newer');
var through = require('through');
var File = require('vinyl');

gulp.task('build_lib', function() {
  return gulp.src(["app/**/*.ts"])
    .pipe(newer("out/outputLib.js"))
    .pipe(through(function(file) {
      // If any files get through newer, just return the one entry
      var libsrcpath = path.resolve('app', 'scripts', 'LibSource.ts');
      // Pass libsrc through the stream
      this.queue(new File({
        base: path.dirname(libsrcpath),
        path: libsrcpath,
        contents: new Buffer(fs.readFileSync(libsrcpath))
      }));
      // Then end this stream by passing null to queue
      // this will ignore any other additional files
      this.queue(null);
    }))
    .pipe(typescript({
      declaration: true,
      sourcemap: true,
      emitError: true,
      safe: true,
      target: "ES5",
      out: "outputLib.js"
    }))
    .pipe(gulp.dest('out/'));
});

答案 1 :(得分:1)

我知道,这个问题是4年前发布的;我敢肯定,这个问题是每个人都能解决的问题,尽管我认为我理解所要提出的问题,但我认为有一种更简单的方法可以执行此任务,因此,我最近在{ {3}} 它使用了gulp-changed,对我来说,它就像是一种魅力,因此对于其他出于类似原因可能会看到此帖子的人,请看看我的帖子,看看它是否是您想要的。 亲切的问候

答案 2 :(得分:0)

您不需要先建立。您可以在第一次运行时使用'只运行你运行所有其他任务的监视任务。

示例:

// Create your 'watch' task
gulp.task( 'watch', function() {
    gulp.watch( 'scripts/*.js', [ 'lint', 'test', 'scripts' ] );
    gulp.watch( 'styles/sass/*.scss', [ 'sass_dev' ] );
} );

// On your first run you will only call the watch task
gulp.task( 'default', [ 'watch' ] );

这将避免在启动时运行任何任务。我希望这会帮助你。

答案 3 :(得分:0)

我建议您gulp-newy在其中操作自己函数中的路径和文件名。然后,只需使用该函数作为newy()的回调。这使您可以完全控制要比较的文件。

这将允许1:1或多对1比较。

newy(function(projectDir, srcFile, absSrcFile) {
  // do whatever you want to here. 
  // construct your absolute path, change filename suffix, etc. 
  // then return /foo/bar/filename.suffix as the file to compare against
}

enter image description here