Gulp 吞下具有多个目标同一src,一个有基,一个无基

xzlaal3s  于 2022-12-08  发布在  Gulp
关注(0)|答案(1)|浏览(169)

我有一个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相关?

vof42yt1

vof42yt11#

Gulp可以在Gulp重命名插件的帮助下重命名目录。
一开始我不知道它是如何工作的,但在我明白之后,我知道它实际上是非常酷的插件。
这个插件所做的只是重命名的路径后,无论剥离的基础,这是默认的gulp源和目的行为复制。
所以原始目录保持从所有glob模式之前的file.base,因此file.base'some/path/more/' + themeconfig.name,但我需要一些修改,即使在这个glob。
我想从序列中删除一个名为web的目录,当它在pubdir上放置result时。
此外,我还更改了dest函数上的file.base,这样当放到pubdir时,它将不相对于origin,并且它将在从序列中删除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;
        }))

相关问题