gulpでディレクトリを再帰的にコピーするにはどうすればよいですか?


167

作業ディレクトリからサーバー(同じマシン)にプロジェクトをステージングしようとしています。次のコードを使用します。

gulp.src([
    'index.php',
    'css/**',
    'js/**',
    'src/**',
])
.pipe(gulp.dest('/var/www/'));

コピーされたすべてのファイルが表示されると思います。ただし、dir構造はフラット化されます-すべてのディレクトリがコピーされますが、すべてのファイルはルートに配置されます/var/www

Gulpは優れたビルドツールのように見えますが、アイテムのコピーは確かに単純なプロセスでなければなりませんか?


9
この質問を読んでいる新しい視聴者にとって、最も投票数の多い回答は、ディレクトリをフラット化しないという元の質問の仕様を解決するためには機能しないことに注意してください。ディレクトリ内のすべてのファイルがコピーされるのではなく、人々が抱えている問題を解決するので、便利です!
M1ke

1
フラット化しないということは、「css」、「js」、および「src」ディレクトリが存在することを意味します/var/www/か?あなたが試すことができます{css,js,src}/**/*
Jason Goemaat 2016年

グロブ展開はgulp内で機能することは知っていますが、リスト内の個々の行として各項目に対して異なる動作をすると混乱するでしょう。グロブ展開は基本的に、実行前にリストに展開することだけを目的としているためです。
M1ke

回答:


319

以下は、フォルダー構造をフラット化せずに機能します。

gulp.src(['input/folder/**/*']).pipe(gulp.dest('output/folder'));

'**/*'重要な部分です。その式は、強力なファイル選択ツールであるグロブです。たとえば、.jsファイルのみをコピーするには、次を使用します。'input/folder/**/*.js'


2
gulp.destを追加するのを忘れたと思います。する必要があります.pipe(gulp.dest('output/folder'));
マシュースプランク2014

3
特定のファイル拡張子でこれをどのように行いますか?
Chev

1
回答を編集して、元のファイルセットの例を提供できますか?私はこれがどのようにわからないよ、より適切なが、私はそれはと比べてどのように機能するかを見てさせていただき{base:"."}方法。
M1ke 2015年

2
baseこの回答で示されているように、デフォルトは「フォルダ」であることに注意することが重要です。つまり、ベースはグロブパターンが始まるところから始まります。これにより、ファイルがどこに配置されるかを理解することができ**/*ました。また、gulp.dest。またパラメーターにます。Gulpはグロブ内のすべてを取得し、同じ構造でdestフォルダーに配置します。
Neil Monroe

3
これは、尋ねられている質問に完全に答えるものではありません。これは再帰的に正しくコピーする方法の良い解決策ですが、ベースディレクトリを変更する方法には答えません。
ty1824 2015年

173

完全なディレクトリ構造をコピーするにgulpは、gulp.src()メソッドのベースを提供する必要があることがわかります。

したがってgulp.src( [ files ], { "base" : "." })、上記の構造で使用して、すべてのディレクトリを再帰的にコピーできます。

私のように、これを忘れてしまった場合は、以下を試してください。

gulp.copy=function(src,dest){
    return gulp.src(src, {base:"."})
        .pipe(gulp.dest(dest));
};

1
「cwd」構成を追加して、現在の作業ディレクトリを設定します。
Skarllot

3
baseそれでも混乱する場合は、stackoverflow.com / a / 35848322/11912ご覧ください。
James Skemp、2017年

60

したがって、すべてのパスが同じベースパスを持つ場合、ベースを提供するソリューションは機能します。しかし、異なるベースパスを提供したい場合、これはまだ機能しません。

この問題を解決する1つの方法は、パスの最初を相対にすることでした。あなたの場合:

gulp.src([
    'index.php',
    '*css/**/*',
    '*js/**/*',
    '*src/**/*',
])
.pipe(gulp.dest('/var/www/'));

これが機能する理由は、Gulpがベースを最初の明示的なチャンクの終わりに設定するためです-先頭の*により、ベースがcwdに設定されます(これは私たち全員が望む結果です!)

これは、フォルダー構造に2回一致する可能性のある特定のパスがないことを確認できる場合にのみ機能します。たとえばrandomjs/、と同じレベルにいた場合js、両方に一致することになります。

これが、これらをトップレベルのgulp.src関数の一部として含めることがわかった唯一の方法です。ただし、それらの各グロブを分離できるプラグイン/関数を作成するのは簡単なので、それらのベースディレクトリを指定できます。


複数の基本パスから開始する必要があることは、おそらく質問の範囲を超えていると思います。元の質問から、ファイルを絶対パスに移動していましたが、ベースを指定せずに、すべてのグロブのすべてのファイルが既存の階層に従っていない単一のディレクトリにコピーされるという問題が引き続き発生しました。
M1ke

2
@ M1ke確かに、あなたの質問の主要なポイントは、さまざまなベースパスに向けられていませんでした。しかし、あなたは言ったHowever it flattens the dir structure - all directories are copied but every file is placed in the root /var/www、そしてこれは実際に私があなたの質問を見つけた方法です-私は異なるベースパスで再帰的にコピーする方法の解決策を探していました。基本的に、このソリューションは、デフォルトのベースを指定する必要がない場合に有効ですが、先頭のスターが何にも一致しないことを確認できる限り、マルチベースパスの場合にも有効です。)
ty1824

6
この答えは例外的です。具体的には、任意の開始点からパスをコピーすることを扱います。src 'assets/subdir/*fonts/*'はフォントdirをコピーするためのものかもしれません。
Wtower 2016

-4

フォルダの内容全体を再帰的に別のフォルダにコピーする場合は、gulpから次のWindowsコマンドを実行できます。

xcopy /path/to/srcfolder /path/to/destfolder /s /e /y

/y最後のオプションは、上書き確認メッセージを抑制することです。

Linuxでは、gulpから次のコマンドを実行できます。

cp -R /path/to/srcfolder /path/to/destfolder

gulp-execまたはgulp-runプラグインを使用して、gulpからシステムコマンドを実行できます。

関連リンク:

  1. xcopyの使用法

  2. gulp-execおよびgulp-run


7
ここでシェルにフォールバックする場合の問題は、圧縮ツールや分析ツールなど、ストリームで他のコマンドを実行できなくなることです。
M1ke 2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.