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

在Gulp中,如果多个文件中的任何一个文件较新,如何仅在一个文件上运行任务?,gulp,Gulp,我可能是想让gulp做一些不惯用的事情,但现在开始。 我希望仅当源文件比输出文件新时才运行生成任务 在gulp中,标准做法似乎是创建一个始终运行的构建任务,然后设置一个监视任务,使其仅在某些文件更改时运行该构建任务。没关系,但这意味着你总是在第一次跑步的基础上继续前进 那么,有可能做我想做的吗?以下是我到目前为止得到的(更新的是吞咽更新的): })) 我试着使用gulpif,但如果没有文件进入它,它似乎不起作用 .pipe(gulpif(are_there_any_files_at_al

我可能是想让gulp做一些不惯用的事情,但现在开始。 我希望仅当源文件比输出文件新时才运行生成任务

在gulp中,标准做法似乎是创建一个始终运行的构建任务,然后设置一个监视任务,使其仅在某些文件更改时运行该构建任务。没关系,但这意味着你总是在第一次跑步的基础上继续前进

那么,有可能做我想做的吗?以下是我到目前为止得到的(更新的是吞咽更新的):

}))

我试着使用gulpif,但如果没有文件进入它,它似乎不起作用

    .pipe(gulpif(are_there_any_files_at_all,
        gulp.src(["app/scripts/LibSource.ts"])))
但是,我的条件函数甚至没有被调用,因为没有可以调用它的文件。在本例中,gulpif调用truthy流,因此LibSource被添加到我的流中,这不是我想要的


也许在一个流中执行所有这些操作真的不是正确的调用,因为我通过“gulp New”过滤器传递这些文件的唯一原因是查看其中是否有更新的文件。然后我将丢弃它们并用另一个文件替换它们。不过,我的问题仍然存在

您不需要先构建。在“第一次运行”时,只能运行运行所有其他任务的监视任务

例如:

// 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' ] );

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

您可以编写自己的直通/转换流来处理以下情况:

// 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/'));
});
我建议您可以在自己的函数中操作路径和文件名。然后,只需将该函数用作对
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
}

我知道,这个问题是在4年前发布的;我确信这个问题会跨越每个人的道路,尽管我认为我理解被问到的问题,但我觉得有一种更简单的方法来完成这项任务,我最近在stackoverflow上发布了一个类似的问题 它使用了gulp changed,对我来说,它就像一个符咒,所以对于其他可能出于类似原因查看此帖子的人,请查看我的帖子,看看它是否是您所寻找的。
亲切的问候

谢谢@dman。newy与我在上面使用的较新的有何不同?特别是,一旦我发现有更新的文件,我就想知道如果有更新的文件,如何打电话,这就是@kyle robinson young给我的答案。我是新来的
gulp
,所以可能是
newy
不知何故为我做了这件事,而我错过了它?如果这对你有效,那么你的罚款<如果您有任何问题,code>newey只是一种选择。很抱歉给你带来了困惑。
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
}