2017-03-06 112 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,因爲它會使數組扁平化,否則會出錯。