我可能试图让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是为了查看它们中是否有更新的。我然后丢弃它们并用另一个文件替换它们。我的问题仍然存在。
答案 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
}