web-dev-qa-db-ja.com

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

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

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

私はすべてのファイルがコピーされるのを見ることを期待するでしょう。ただし、dir構造は平坦化されています。すべてのディレクトリはコピーされますが、すべてのファイルはルート/var/wwwに配置されます。

Gulpは素晴らしいビルドツールのようですが、アイテムのコピーは確かに簡単なプロセスであるべきですか?

156
M1ke

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

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

もし私と同じように、あなたがこれを忘れるかもしれないなら、試してみてください。

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

以下はフォルダ構造をフラットにせずに動作します。

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

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

294
cancerbero

そのため、すべてのパスが同じベースパスを持つことを前提として、ベースを提供するという解決策が機能します。しかし、もしあなたが異なるベースパスを提供したいのであれば、これはまだうまくいきません。

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

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

これが機能する理由は、Gulpが基底を最初の明示的なチャンクの末尾に設定することです。

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

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

54
ty1824