シンボリックリンクのあるディレクトリでgulp watchして痛い目を見たお話


はじめに

件名通りです。
痛い目を見ないように、備忘録も兼ねて。

gulp watchでファイルの変更を監視しよう

タイトルのように思った時が私にもありました( ˘ω˘)

watch対象のディレクトリ構成はこちら

test
 ├─foo
 |  └─ foo.txt
 |
 ├─bar(fooへのsymlink)
 |
 └─test.txt

とってもシンプルな構成です。

watch開始ッ!

gulpfile.js
const gulp = require('gulp');

gulp.task('default', () => {
  const watcher = gulp.watch('test/*');
  watcher.on('change', function (event) {
    console.log(event.path);
  })
});

これをnpmから起動してtest配下をwatchしてみました。
変更があればパスを表示するだけのはず……!

test.txtの更新

touch test/test.txt

touchコマンドで更新日時を書き換えてみます。
さて、gulpのwatchの結果はというと……

$ gulp
[23:33:48] Starting 'default'...
[23:33:48] Finished 'default' after 7.42 ms
/xxx/test/test.txt
/xxx/test/bar

test.txtを更新していないのにbarもconsole.logとして対象に出ているッ!?
今回はconsole.logなんですが、barディレクトリのpathをファイル操作系の関数とかに突っ込んでいたりすると……
まぁ、タイトルが痛い目を見たお話というところで察して下さい。

考察

gulpは特にバグっていないとして

symlinkのあるディレクトリでファイルを更新すると、symlink側の更新?リンクの再生成か何かが起きる?
そのためにgulpのwatchイベントに引っかかる。

……とかなのだろうか?

このあたり、原因や理由が書かれているドキュメント的なものがあれば欲しい……
どなたかご存知でしたら