Gulp:基于管道输出的条件执行?

时间:2017-07-02 18:57:44

标签: gulp gulp-watch node-streams

我想构建一个gulp任务,只有当 src 目录中的一个或多个文件比新文件更新时才执行外部构建工具(mvn) 目标目录中的任何文件。 (在我的例子中,检查目标目录中某个特定文件的日期就可以了。)

我尝试将 gulp-newer gulp-exec 等插件组合在一起,这似乎与我想要的一样,但它运行外部命令的次数太多次了(每个源文件一次),当我像这样使用它们时:

var gulp = require('gulp');
var newer = require('gulp-newer');
var exec = require('gulp-exec');

var paths = {
    src: ["pom.xml", "src/**/*", "resources/**/*", "test/**/*"],
    target: "target/antlr4-typescript-4.6-SNAPSHOT-complete.jar"
}

gulp.task('maven', function() {
    return gulp.src( paths.src)
        .pipe(newer( paths.target ))
        .pipe(exec('echo mvn install -Dmaven.test.skip=true'))
        .pipe(exec.reporter())
        ;
})

我理解为什么它会以这种方式工作,但是如何缩小多个源文件之间的差距并仅调用一次外部工具呢?

gulp-exec上的文档说:

  

注意:如果您只想运行命令,只需运行命令,不要使用此插件。

...但如果从我的gulp.src | newer管道生成任何输出,我不知道如何使用child_process.exec。

1 个答案:

答案 0 :(得分:0)

考虑到这一点似乎需要一个简单的对象流过滤器,我已经编写并命名为gulp-first。以下是它的应用程序:



var gulp = require('gulp');
var newer = require('gulp-newer');
var first = require('gulp-first');
var exec = require('gulp-exec');

var paths = {
    src: ["pom.xml", "src/**/*", "resources/**/*", "test/**/*"],
    target: "target/antlr4-typescript-4.6-SNAPSHOT-complete.jar"
}

gulp.task('maven', function () {
    return gulp.src(paths.src, { read: false })
        .pipe(newer(paths.target))
        .pipe(first())
        .pipe(exec('mvn install -Dmaven.test.skip=true'))
        .pipe(exec.reporter())
        ;
})




如果目标是最新的,gulp-exec永远不会执行,但如果需要,最多只执行一次。

对此解决方案的反馈表示欢迎。