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

时间:2014-03-15 02:28:55

标签: node.js automation overwrite 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 */);

那么我怎样才能结束它以使每个src文件在其原始位置覆盖自己?我可以传递给gulp.dest()这样做吗?

4 个答案:

答案 0 :(得分:39)

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

  1. base添加gulp.src选项,如下所示:

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

    这将告诉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)));
    }
    

    如果你需要异步运行它们,第一个将更容易,因为你需要使用类似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);
    

答案 1 :(得分:14)

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

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

            console.log("Writing to directory: " + data.base);
            return data.base;
        })
    )

(数据参数为a vinyl file object

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

答案 2 :(得分:0)

如果您使用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");

如果您希望源和目标是绝对路径,

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

答案 3 :(得分:0)

我不确定为什么人们会使其复杂化,但是只需使用"./"开始您的目标路径即可。

说路径为'dist/css',则可以这样使用   .pipe(gulp.dest("./dist/css"));

就是这样,我在每个项目中都使用这种方法。