Gulp src忽略递归复制的全局路径的一部分

Gulp src忽略递归复制的全局路径的一部分,gulp,copy,glob,Gulp,Copy,Glob,我想将一些openui5资源文件从bower软件包复制到我的输出文件夹中。它们都有一个共同的前缀(openui5-)。它们都有一个名为“资源”的子文件夹。我想将该内容从该子文件夹复制到输出中的一个公共“资源”文件夹 我想用glob把它们一饮而尽。现在我必须明确地给出每个路径 ['bower_components/openui5-sap.m/resources/**/*', 'bower_components/openui5-sap.ui.core/resources/**/*', 'bowe

我想将一些openui5资源文件从bower软件包复制到我的输出文件夹中。它们都有一个共同的前缀(openui5-)。它们都有一个名为“资源”的子文件夹。我想将该内容从该子文件夹复制到输出中的一个公共“资源”文件夹

我想用glob把它们一饮而尽。现在我必须明确地给出每个路径

['bower_components/openui5-sap.m/resources/**/*',
 'bower_components/openui5-sap.ui.core/resources/**/*',
 'bower_components/openui5-themelib_sap_belize/resources/**/*']
我想使用这样的模式:

'bower_components/openui5-*/resources/**/*'
out/resources/
+ -- openui5-sap.m/resources/...
+ -- openui5-sap.ui.core/resources/...
+ -- openui5-themelib_sap_belize/resources/...
但是如果我这样做,我也会复制完整的模块名,因此我的资源文件夹如下所示:

'bower_components/openui5-*/resources/**/*'
out/resources/
+ -- openui5-sap.m/resources/...
+ -- openui5-sap.ui.core/resources/...
+ -- openui5-themelib_sap_belize/resources/...
我理解这是因为默认情况下,gulp.src获取第一个glob(在模块名中),并从那里生成递归结构

有没有一种方法可以忽略输出的glob模式的一部分,或者使用另一个glob修剪输出路径

我到处玩,寻找解决办法,但什么也找不到

吞咽重命名似乎使整个层次结构变得平坦:

gulp.task('copyui5resources', function() {
    gulp.src('bower_components/openui5-*/**/*')
        .pipe(rename({ dirname: '' }))
        .pipe(gulp.dest('out/resources'));
});
使用base选项也没有帮助。它似乎只是复制了其中的一部分:

gulp.task('copyui5resources', function() {
    gulp.src('bower_components/openui5-*/**/*', {base: 'bower_components/openui5-*'})
        .pipe(gulp.dest('out/resources'));
});
这是一个屏幕截图,显示了我的输入文件夹结构和到目前为止我的吞咽任务。谢谢你的帮助


您尝试使用
gulp rename
是正确的。然而,
dirname
选项对于您试图完成的任务来说不够强大,因为它只能替换整个目录结构。你只想替换它的一部分

对于此类情况,可以为
gulp rename
提供一个函数,该函数允许您使用JavaScript提供的一切内容(包括
string.replace()
)更改
dirname

这意味着您可以这样做:

var gulp = require('gulp');
var rename = require('gulp-rename');

gulp.task('default', function() {
  return gulp.src('bower_components/openui5-*/resources/**/*')
    .pipe(rename(f => f.dirname = f.dirname.replace(/openui5-.*?\//, '')))
    .pipe(gulp.dest('out/'));
});

谢谢你的帮助,斯文

今天早上,在我读你的文章之前,我在另一篇文章中偶然发现了这个提示:(我删除了路径的前两部分,得到了期望的结果。它的优点是,你可以跳过任意多个部分,而正则表达式解决方案的优点是捕获更多类似的路径部分

完成:以下是我提出的解决方案:

var gulp = require('gulp'),
    rename = require('gulp-rename'),
    path = require('path');

gulp.task('copyui5resources', function() {
    gulp.src('bower_components/openui5-*/resources/**/*')
        .pipe(rename(function(p) {
            var nda = p.dirname.split(/[\\\/]/);
            nda.splice(0, 2); 
            p.dirname = nda.length > 0 ? path.join.apply(null, nda) : "";
        }))
        .pipe(gulp.dest('out/resources'));
});
我使用path重新连接独立于操作系统的路径。Splice将删除前两个包含包名和资源目录的部分。您必须使用path.join.apply,因为它会展平阵列,否则会出现错误