Gulp で特定の名前のディレクトリ下のファイルのみ処理から除外する ( `node-glob` の備考あり)

Gulp で特定の名前のディレクトリ下のファイルのみ処理から除外したくなったのでやってみました。ついでに node-glob について知識が得られたのでその件も付記しておきます。

経緯

composer で入れた vendor ディレクトリの中のパッケージのうち、必要なファイルのみコピーしたいと考えたのがきっかけでした。

具体的には、以下の条件を満たすようにしたかったのです。

  • 基本的には .php ファイルをコピー
  • ただし、 test ディレクトリ下の .php は除外

意図としては、「必要最低限のPHPのみデプロイしたい」というのがありました。

composer.jsonrequire フィールドと require-dev フィールドを分けて書いておいて、 composer install --no-dev とすることで require に記述されたパッケージのみ vendor に入れることができるのは知っていました。これで PHPUnit などの開発環境にしか使わないパッケージは除外できます。

ただし、これでも require フィールドに既述されたパッケージの中の test ディレクトリ、つまりそのパッケージ用のテストコードは入ってきてしまいます。なるべくならそれも除外したい、と。

結果 (初期段階)

結果として、 Gulp のPHPファイルコピータスクを以下のように記述することで実現できました。

const gulp    = require('gulp');
const plumber = require('gulp-plumber');
const notify  = require('gulp-notify');

const phpcopy = () => {
    return gulp.src(
        [
            './src/php/**/*.php',
            '!./src/php/**/test/**/*.php'
        ]
    )
    .pipe(plumber({
        errorHandler: notify.onError({
            message: 'Error: <%= error.message %>',
            title: 'php copy'
        })
    }))
    .pipe(gulp.dest('./dist'));
};

除外しているのは gulp.src の配列の2つ目、 !./src/php/**/test/**/*.php ですね。

gulp.src のオプションと node-glob について

ところで、 gulp.src のドキュメントを見ると以下のように書いてありました。

src(globs, [options])

src() | gulp.js

……2つ目の引数 options がある……?

これを詳しく見てみると、 ignore キーがありました。しかもこれは node-glob にそのまま渡されるもののようです。

Note: These globs are always matched against dot files, regardless of any other settings.
This option is passed directly to node-glob.

src() | gulp.js

結果 (最終版)

この記述から、先ほどのコードは以下のようにも書くことができるようです(実際には .php 以外のファイルも処理しているので gulp.src の引数は配列のままにしてあります)。

const gulp    = require('gulp');
const plumber = require('gulp-plumber');
const notify  = require('gulp-notify');

const phpcopy = () => {
    return gulp.src(
        [
            './src/php/**/*.php'
        ],
        {
            ignore: [
                './src/php/**/test/**/*.php'
            ]
        }
    )
    .pipe(plumber({
        errorHandler: notify.onError({
            message: 'Error: <%= error.message %>',
            title: 'php copy'
        })
    }))
    .pipe(gulp.dest('./dist'));
};

この書き方の方が除外されるファイル・ディレクトリが一目瞭然なので読みやすさは上がり、ヒューマンエラーを抑止できるのではないかと期待しました。

……が、この話には続きがありました

参考

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。