我想将一些openui5资源文件从bower包复制到我的输出文件夹中。它们都有一个共同的前缀(openui5-)。他们都有一个名为" resources"的子文件夹。我想将该子文件夹中的内容复制到一个常见的资源中。我输出中的文件夹。
我想使用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模式部分或使用另一个glob修剪输出路径?
我四处游玩并寻找任何解决方案,但我找不到任何东西。
gulp-rename似乎使整个层次结构变得扁平化: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任务的截图。谢谢你的帮助!
答案 0 :(得分:1)
您正试图使用gulp-rename
。但是dirname
选项对于您要完成的任务不够强大,因为它只能替换整个目录结构。你想要只替换它的一部分。
对于像gulp-rename
这样的情况,可以提供一个函数,允许您使用JavaScript提供的所有内容({1}}来更改dirname
。
这意味着你可以这样做:
string.replace()
答案 1 :(得分:0)
感谢您的帮助Sven,
在我阅读你的帖子之前,我今天早上在另一篇文章中偶然发现了这个暗示:(我删除了路径的前两部分并得到了预期的结果。它有一个优点,你可以跳过你想要的多个部分并且正则表达式解决方案具有捕获更多类似路径部分的优势。
完成:这是我提出的解决方案:
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,因为它会使数组变平,否则就会出错。