Gulp で特定の名前のディレクトリ下のファイルのみ処理から除外したくなったのでやってみました。ついでに node-glob
について知識が得られたのでその件も付記しておきます。
経緯
composer で入れた vendor
ディレクトリの中のパッケージのうち、必要なファイルのみコピーしたいと考えたのがきっかけでした。
具体的には、以下の条件を満たすようにしたかったのです。
- 基本的には
.php
ファイルをコピー - ただし、
test
ディレクトリ下の.php
は除外
意図としては、「必要最低限のPHPのみデプロイしたい」というのがありました。
composer.json
で require
フィールドと 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])
……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.
結果 (最終版)
この記述から、先ほどのコードは以下のようにも書くことができるようです(実際には .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'));
};
この書き方の方が除外されるファイル・ディレクトリが一目瞭然なので読みやすさは上がり、ヒューマンエラーを抑止できるのではないかと期待しました。
……が、この話には続きがありました。