2017-03-06 19 views
1

bowerパッケージからいくつかのopenui5リソースファイルを出力フォルダにコピーしたいと思います。それらはすべて共通の接頭辞(openui5-)を持っています。彼らはすべて "リソース"と呼ばれるサブフォルダを持っています。そのサブフォルダからそのコンテンツを私の出力の1つの一般的な "resources"フォルダにコピーしたいと思います。Gulp srcは再帰コピー用の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/**/*' 

しかし、私はこれを行う場合、私はあまりにも、コピーされた完全なモジュール名を取得します私はデフォルトのgulp.srcあたりの(モジュール名である)最初のグロブを取り、そこからの再帰的な構造を作るためであることを理解するようになったとして

out/resources/ 
+ -- openui5-sap.m/resources/... 
+ -- openui5-sap.ui.core/resources/... 
+ -- openui5-themelib_sap_belize/resources/... 

:私のリソースフォルダは、次のようになります。

出力のグロボパターンの一部を無視する方法や、別のグロブを使用して出力パスをトリミングする方法はありますか?

私は遊んで何か解決策を探しましたが、何も見つかりませんでした。

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タスクのスクリーンショットです。ご協力ありがとうございました!

Folder structure

答えて

1

あなたはgulp-renameを使用しようとして正しい軌道に乗っています。しかし、オプションは、ディレクトリ構造全体を置き換えることしかできないため、達成しようとしているものに対して十分強力ではありません。あなたはその一部を置き換えたいと思う。

の場合gulp-renameには、string.replace()など、JavaScriptが提供するすべての機能を使用して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/')); 
}); 
0

は、あなたの助けスヴェンため

をありがとう私は別のポストに今朝そのヒントにつまずいパスの最初の2つの部分が目的の結果を得ました。それはあなたが必要とする多くの部分をスキップすることができ、正規表現のソリューションはより類似したパス部分をキャッチする利点があります。ソリューション私は思い付いた:

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は、パッケージ名とresourcesディレクトリを持つ最初の2つの部分を削除します。配列を平坦化するので、path.join.applyを使用する必要があります。そうしないと、エラーが発生します。

関連する問題