gulp 同一个 src 有多个目标,一个有 base,一个没有 base

gulp same src with multiple destination one with base and one without base

我有一个 gulpfile.js 并且我需要具有多个目的地的相同 src glob。但是如本 中所指定,如果我指定 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 可以在 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;
        }))