Node.js Gulp能否覆盖所有src文件?

Node.js Gulp能否覆盖所有src文件?,node.js,automation,overwrite,gulp,Node.js,Automation,Overwrite,Gulp,假设我想替换一堆文件中的版本号,其中许多文件位于子目录中。我将通过管道传输文件以运行regex replace函数;但我最终会想覆盖所有原始文件 任务可能如下所示: gulp.src([ './bower.json', './package.json', './docs/content/data.yml', /* ...and so on... */ ]) .pipe(replace(/* ...replacement... */)) .pipe(gu

假设我想替换一堆文件中的版本号,其中许多文件位于子目录中。我将通过管道传输文件以运行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()
的方法可以做到这一点吗?

我可以想出两种解决方案:

  • base
    选项添加到
    gulp.src
    中,如下所示:

    gulp.src([...files...], {base: './'}).pipe(...)...
    
    这将告诉gulp保留整个相对路径。然后将
    './'
    传递到
    gulp.dest()
    以覆盖原始文件。(注意:这是未经测试的,您应该确保您有一个备份,以防它不起作用。)

  • 使用函数。Gulp只是JavaScript,所以您可以这样做:

    [...files...].forEach(function(file) {
        var path = require('path');
        gulp.src(file).pipe(rename(...)).pipe(gulp.dest(path.dirname(file)));
    }
    
    如果您需要异步运行这些程序,那么第一个程序会容易得多,因为您需要使用类似
    事件流。合并
    并将流映射到一个数组中。看起来像

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

  • 告诉gulp写入相关文件的基本目录,如下所示:

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


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

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

    我不知道为什么人们会把它复杂化,但只要用
    “/”
    开始你的目标路径就可以了

    假设路径是
    'dist/css'
    ,那么您可以这样使用它
    .pipe(gulp.dest(“./dist/css”)


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

    您要更改的文件是
    .json
    文件?还是明文?您可以为每个要更改的文件运行
    gulp.src()…
    。是的,但这正是我想要避免的:为每个单独的文件指定
    gulp.src()
    ,并通过其自己的regex replace对每个文件进行管道传输,事实上,这是相同的。相反,我想使用一系列全局模式。如果
    ,你可以使用
    gulp来实现某些功能,但只要源文件不在同一个文件夹中,我认为你不可能在一次调用中实现这一功能。#1对我来说很有用!谢谢在《大口大口大口》的任何地方都没有解释,是吗?你说得对。
    base
    选项来自
    glob-stream
    包,它来自
    vinyl-fs
    包,该包都是
    gulp.src
    is。这不容易追踪。哦,亲爱的上帝,如果新构建的内容比文件中以前的数据短,那么旧内容的结尾将保留在te文件中。换句话说,文件在写入之前不会被截断…必须“喜欢那些未记录的特性!”!谢谢你!到处找!