tanaka's Programming Memo

プログラミングについてのメモ。

gulpのsrcでのファイル指定

コピーやFTPのアップロード時に複数ファイルを選択する方法を調べていました。gulpのsrcはglob形式で指定できます。

Globの書式

globの公式の情報は以下。

上記を斜め訳。

Globの概要

Globは ls *.js をコマンドラインで指定したり、 .gitignore ファイル内でbuild/* を指定するようにファイルをフィルタリングできます。

パスのパターンを解釈する前に、{}で囲まれたBraced Sectionをパターン内に展開します。コンマ区切りで複数のキーワードを指定します。{}内にスラッシュ(/)を含めることもでき、a{/b/c,bcd}と指定すると、a/b/cとabcdに展開します。

以下の文字は特殊な機能を持ちます。

  • * 1つのパスの0以上の文字列に一致
  • ? 1文字分の任意の文字に一致
  • [...] 文字の範囲に一致。正規表現の範囲と同様のもの。最初の文字が ! か ^ だった場合、指定した範囲外のすべての文字に一致
  • !(パターン|パターン|パターン) |で区切って書いたパターンに合致しない文字列に一致
  • ?(パターン|パターン|パターン) 全く一致しないか、パターンのいずれか1つに一致
  • +(パターン|パターン|パターン) パターンの1つ以上が一致
  • *(a|b|c) 0以上のパターンと一致
  • @(パターン|pat*|pat?erN) パターンのうちの1つに完全に一致
  • ** パスの該当箇所を任意のディレクトリーに置き換えて、ディレクトリーやサブディレクトリーを探査する。シンボリックリンクは探査しない

ドット

ファイルやディレクトリーパスの最初が . だった場合、同じく . から始まるパターン以外のglobのパターンとは一致しません。

例えば、 a/.*/c というパターンは、a/.b/c というファイルと一致します。しかし、 a/*/c とした場合は、 . から開始していないのでa/.b/cとは一致しません。

dot:true オプションを指定すると、ドットを通常のキャラクターと同様に扱うことができます。

Basename のマッチング

matchBase:true オプションを指定してパターンにスラッシュを含まない場合、baseName以下にあるすべてのファイルを検索します。 *.js というパターンは、 test/simple/basic.js に一致します。

まとめ

とりあえず、gulpで利用するにはこれぐらいで十分でしょう。

gulp.srcの解説

gulpの公式の情報は以下。

これのgulp.srcの欄を斜め読み。

gulp.src(globs[, options])

globやglobの配列に一致するファイルを対象にします。見つけたファイルのVinyl Filesのstreamを返し、プラグインでpipeできます。

gulp.src('client/templates/*.jade')
  .pipe(jade())
  .pipe(minify())
  .pipe(gulp.dest('build/minified_templates'));

以上のように書くことができます。

globs

glob形式の文字列か配列で指定できます。

options

オプションをオブジェクトで指定します。省略可能です。

options.baseを指定すると、destで出力する場合に、どのフォルダーからコピー対象かが指定できます。詳しくはリンク先の例を参照のこと。
gulp/API.md at master · gulpjs/gulp · GitHub

まとめ

複数のファイルをsrcで指定するにはglobパターンを使って指定するか、配列にして指定します。例えばadminフォルダー内のhtmlファイルとjsファイルを指定したい場合は以下のようにします。

gulp.src('./admin/*.+(html|js)')
  .pipe(・・・)

もう少し複雑な場合は、配列で指定すればよさそうです。