2017-03-06 95 views
1

我想从bower包中将一些openui5资源文件复制到我的输出文件夹中。他们有一个共同的前缀(openui5-)。他们都有一个名为“资源”的子文件夹。我想将该子文件夹中的内容复制到输出中的一个常见“资源”文件夹中。gulp src忽略递归副本的glob路径的一部分

我想用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/... 

至于我才明白,这是因为每默认gulp.src取第一水珠(这是在模块名称),使递归结构从那里。

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

我玩过并搜索任何解决方案,但找不到任何东西。

一饮而尽,重命名似乎拉平整个层次:

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

这里是我的输入文件夹结构,我一饮而尽任务截图至今。感谢您的帮助!

Folder structure

回答

1

你是在正确的轨道尝试使用gulp-rename上。但是dirname选项对于您要实现的功能来说功能不够强大,因为它只能替换整个目录结构。你只想替换它的一部分。

像这些gulp-rename案件可以用一个功能,它允许你改变dirname使用JavaScript的一切所提供的包括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/')); 
}); 
0

谢谢你的帮助斯文,

我只是那一抹今天早上迷迷糊糊的另一篇文章之前,我看了你的帖子:(我删除了前两个部分的路径,并得到了预期的结果,它的优点是,你可以跳过尽可能多的部分,正则表达式的解决方案的优势是捕捉更多类似的路径部分。解决方案我想出了:

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

我用路径来重新加入独立于操作系统的路径。Splice使用软件包名称和资源目录删除前两部分。你必须使用path.join.apply,因为它会使数组扁平化,否则会出错。