Gulp可以覆盖所有src文件吗?

dav*_*ark 30 automation overwrite node.js gulp

假设我想替换一堆文件中的版本号,其中许多文件存在于子目录中.我将通过gulp-replace管道文件来运行regex-replace函数; 但我最终会想要覆盖所有原始文件.

任务可能如下所示:

gulp.src([
    './bower.json',
    './package.json',
    './docs/content/data.yml',
    /* ...and so on... */
  ])
  .pipe(replace(/* ...replacement... */))
  .pipe(gulp.dest(/* I DONT KNOW */);
Run Code Online (Sandbox Code Playgroud)

那么我怎样才能结束它,以便每个src文件在原始位置覆盖自己?有什么我可以传递到gulp.dest()这将做到这一点?

Ove*_*ous 40

我可以想到两个解决方案:

  1. base您添加一个选项,gulp.src以便:

    gulp.src([...files...], {base: './'}).pipe(...)...
    
    Run Code Online (Sandbox Code Playgroud)

    这将告诉gulp保留整个相对路径.然后传递'./'gulp.dest()覆盖原文件.(注意:这是未经测试的,您应该确保备份,以防它不起作用.)

  2. 使用功能.Gulp只是JavaScript,所以你可以这样做:

    [...files...].forEach(function(file) {
        var path = require('path');
        gulp.src(file).pipe(rename(...)).pipe(gulp.dest(path.dirname(file)));
    }
    
    Run Code Online (Sandbox Code Playgroud)

    如果你需要异步运行它们,第一个将更容易,因为你需要使用类似的东西event-stream.merge,并将流映射到数组.它看起来像

    var es = require('event-stream');
    
    ...
    
    var streams = [...files...].map(function(file) {
            // the same function from above, with a return
            return gulp.src(file) ...
        };
    return es.merge.apply(es, streams);
    
    Run Code Online (Sandbox Code Playgroud)

  • 你是对的.`base`选项来自`glob-stream`包,它来自`vinyl-fs`包,它都是`gulp.src`.追踪并不容易. (6认同)
  • #1为我工作!谢谢.似乎没有在Gulp文档中的任何地方解释,是吗? (3认同)

Yil*_*ing 14

告诉gulp写入相关文件的基本目录,就像这样:

    .pipe(
        gulp.dest(function(data){

            console.log("Writing to directory: " + data.base);
            return data.base;
        })
    )
Run Code Online (Sandbox Code Playgroud)

(data参数是一个乙烯基文件对象)

这种方法的优点是,如果您拥有来自多个源的文件,每个文件都嵌套在文件结构的不同级别,则此方法允许您正确覆盖每个文件.(因为在管道链的上游设置了一个基本目录)