【问题标题】:gulp same src with multiple destination one with base and one without basegulp 具有多个目标的同一个 src 一个有基数,一个没有基数
【发布时间】:2023-11-16 22:12:01
【问题描述】:

我有一个 gulpfile.js,我需要有多个目的地的相同 src glob。但是正如answer 中所指定的,如果我指定 base,那么我从 some 开始的整个目录都将被复制到 pubdir,这是一个问题。

var moduleglob = 'some/path/more/' + themeconfig.name + '/' + '**/**/styles/some.scss';

gulp.src(moduleglob,{ base: "./" })
        .pipe(sourcemaps.init({loadMaps: true}))
        .pipe(sass().on('error', sass.logError))
        .pipe(sourcemaps.write('./'))
        .pipe(gulp.dest("."))

gulp.src(moduleglob)
        .pipe(sourcemaps.init({loadMaps: true}))
        .pipe(sass().on('error', sass.logError))
        .pipe(sourcemaps.write('./'))
        .pipe(gulp.dest(pubdir))

有没有一种方法可以将上述两个代码合并为一个,同时能够指向两个正确的文件夹,即一个与 root 相关,一个与 pubdir 相关?

【问题讨论】:

    标签: gulp glob


    【解决方案1】:

    Gulp 可以借助 gulp 重命名插件重命名目录。

    一开始我不知道它是如何工作的,但当我明白之后我才知道它实际上是一个非常酷的插件。

    这个插件所做的只是在去掉默认 gulp src 和 dest 行为的基础后重命名复制的路径。

    所以原始目录一直在使用 glob 模式之前的所有 file.base,因此 file.base'some/path/more/' + themeconfig.name,但即使在这个 glob 之后我也需要进行一些修改。

    当将结果放到 pubdir 上时,我想从序列中删除一个名为 web 的目录。

    另外,我更改了 dest 函数上的 file.base,因此在拖放到 pubdir 时它不会与原点相关,并且会在从序列中删除 web 后放置目录。

    所以上面两条命令可以这样写。

    gulp.src(moduleglob,{ base: "./" })
            .pipe(sourcemaps.init({loadMaps: true}))
            .pipe(sass().on('error', sass.logError))
            .pipe(sourcemaps.write('./'))
            .pipe(gulp.dest("."))
            .pipe(rename(function (path) {
                // Updates the object in-place
               let newpathdir = path.dirname.replace('web/','');
               return {
                  dirname: newpathdir,
                  basename: path.basename,
                  extname: path.extname
                };
               
            }))
            .pipe(gulp.dest(function(file){
                file.base = 'some/path/more/' + themeconfig.name;
                return pubdir;
            }))
    

    【讨论】: