Gulp src 忽略递归复制的部分 glob 路径

Gulp src ignore part of glob path for recursive copy

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

我想用 glob 来复制它们 gulp。现在我必须明确给出每条路径

['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/...

据我了解,这是因为默认情况下 gulp.src 采用第一个 glob(在模块名称中)并从那里构建递归结构。

有没有办法忽略输出的部分 glob 模式或 trim 使用另一个 glob 的输出路径?

我四处寻找解决方案,但我找不到任何东西。

gulp-重命名似乎使整个层次结构扁平化:

gulp.task('copyui5resources', function() {
    gulp.src('bower_components/openui5-*/**/*')
        .pipe(rename({ dirname: '' }))
        .pipe(gulp.dest('out/resources'));
});

使用基本选项也无济于事。好像只复制了一部分:

gulp.task('copyui5resources', function() {
    gulp.src('bower_components/openui5-*/**/*', {base: 'bower_components/openui5-*'})
        .pipe(gulp.dest('out/resources'));
});

这是我的输入文件夹结构和到目前为止的 gulp 任务的屏幕截图。感谢您的帮助!

您尝试使用 gulp-rename 的方向正确。但是 dirname 选项对于您想要完成的事情来说还不够强大,因为它只能替换整个目录结构。您只想替换其中的一部分。

对于像这样的情况 gulp-rename 可以提供一个函数,它允许您使用 JavaScript 必须提供的所有内容来改变 dirname,包括 string.replace()

这意味着你可以这样做:

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/'));
});

谢谢斯文的帮助,

我今天早上在阅读你的 post 之前在另一个 post 中偶然发现了这个提示 :( 我删除了路径的前两部分并得到了想要的结果。它有优势,您可以跳过任意多的部分,并且正则表达式解决方案具有捕获更多相似路径部分的优势。

完成:这是我想出的解决方案:

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

我使用路径重新加入独立于 OS 的路径。 Splice 删除了包名和资源目录的前两部分。您必须使用 path.join.apply,因为它会展平数组,否则会出现错误。