2015年2月26日木曜日

Git - gulpのパッケージをgitで共有したくなかったら

gulp、そしてgulpで利用するパッケージだけで、かなりディレクトリ容量が膨らむ。
これをgitで共有するのは嫌だなあと思って試行錯誤。

とりあえず、グローバルとローカルの両方にgulpをインストールするのではなく、グローバルだけにできないかと思ったが、逆(ローカルのみインストールする)はあっても、グローバルのみで動かす設定は発見できず。

gulp.jsのフローを見る限り、ローカルへのインストールは必須のようだし。
if (!env.modulePath) {
    gutil.log(
      chalk.red('Local gulp not found in'),
      chalk.magenta(tildify(env.cwd))
    );
    gutil.log(chalk.red('Try running: npm install gulp'));
    process.exit(1);
  }

このフローの通り、ローカルにgulpがインストールされていないと、gulpの実行はできない。
[13:20:52] Local gulp not found in ~/git/プロジェクト名
[13:20:52] Try running: npm install gulp


gulpが、グローバルとローカルとの、両方でインストールが必須なのには構造的な理由がある。

グローバルにインストールされたgulpは、ローカルにインストールされたgulpを実行するためのもの。このグローバルとローカルの2つのモジュールの中身は完全に同じもので、まったく同じモジュールをグローバルとローカルにインストールすることになる。

gulpコマンドが実行されると、gulp.jsのrequireで、ローカルのgulpがインポートされる。

そして、実際の処理(gulpfile.jsに書かれたタスク)はrequireされたローカルのgulpモジュールが全て行う。つまり、gulpは、自分自身が自分自身と同じモジュールをrequireして使うという仕組みで動いている。


では、ローカルへのインストールは仕方がないとしても、gitで共有したくない問題はどうにかできないかと思ったら、

gitなどでプロジェクト共有している場合、この node_modules を共有していると結構重かったりしますし、 package.json が共有されていたらあとで $ npm install をしたら必要なものが入ってくるため、 node_modules のディレクトリの共有は不要です。
Node.js 製の タスクランナー gulp.js を使ってみる - HAM MEDIA MEMO


ハッ!その手があったか!思わずポンと手を打ってしまった。


.gitignoreでnode_modulesをignoreすればいいじゃないですか。


gitからクローンした際は、npm installすればパッケージはインストールされるんだし。


ですよねぇ。これって常識だったのかしら。


追記

.gitignoreのサンプルは以下。一行だけだけれど。

/node_modules/

上記内容をプロジェクト直下にファイル名「.gitignore」で保存。
「node_modules」の前の/で、プロジェクトと同階層であることを明示。
「node_modules」の後の/で、ディレクトリであることを明示。

つまり、「/node_modules/」で、プロジェクト直下のnode_modulesディレクトリを無視する、という設定になる。