Gulp能否覆盖所有的src文件?

比方说,我想replace一堆文件中的版本号,其中许多文件位于子目录中。 我将通过gulp-replacepipe道来运行正则expression式replacefunction; 但我最终会想覆盖所有的原始文件

任务可能看起来像这样:

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

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

我可以想到两个解决scheme:

  1. 添加一个base选项到你的gulp.src就像这样:

     gulp.src([...files...], {base: './'}).pipe(...)... 

    这将告诉大家保存整个相对path。 然后将'./'传入gulp.dest()来覆盖原始文件。 (注意:这是未经testing的,你应该确保你有一个备份,如果它不起作用。)

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

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

    如果你需要asynchronous运行,第一个会更容易,因为你需要使用类似event-stream.merge东西,并将这些stream映射到一个数组中。 看起来像

     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); 

告诉大家写入有问题的文件的基本目录,就像这样:

  .pipe( gulp.dest(function(data){ console.log("Writing to directory: " + data.base); return data.base; }) ) 

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

这种方法的优点是,如果你有来自多个源的文件,每个文件嵌套在文件结构的不同层次上,这种方法允许你正确地覆盖每个文件。 (如同在pipe道链的上游设置一个基本目录一样)

如果你使用gulp-rename ,这是另一个解决方法:

 var rename = require('gulp-rename'); ... function copyFile(source, target){ gulp.src(source) .pipe(rename(target)) .pipe(gulp.dest("./")); } copyFile("src/js/app.js","dist/js/app.js"); 

如果你想源和目标是绝对path,

 var rename = require('gulp-rename'); ... function copyFile(source, target){ gulp.src(source.replace(__dirname,".")) .pipe(rename(target.replace(__dirname,"."))) .pipe(gulp.dest("./")); } copyFile("/Users/me/Documents/Sites/app/src/js/app.js","/Users/me/Documents/Sites/app/dist/js/app.js");