Herokuでnpmのキャッシュにはまった

先週末Heroku + Node.jsではまったのでメモしておきます。

tl;dr

  • npmのdependenciesにgitレポジトリを指定したらHerokuのキャッシュではまった
  • heroku/heroku-repoいれたら快適Heroku生活できるようになった

npmのdependenciesにGitHubレポジトリを指定する

npmを使う際、npmのレポジトリが古くGitHubレポジトリを使いたい場面に遭遇しました。 調べたところnpmには直接GitHubレポジトリを指定することができるらしいとのこと。

レポジトリURL/tarball/masterという書き方でうまく取り込めるようになりました。GitHubレポジトリを取り込めるってことは、フォークして修正したレポジトリも使えるようになるので色々便利です。

Herokuでnode_modulesがキャッシュされる

npmのdependenciesにGitHubのフォークレポジトリを指定すると、GitHubのコミットがHerokuに反映されない問題に遭遇。

Heroku Node.js Support | Heroku Dev Center

Herokuはnode_modulesフォルダを.gitignoreに登録するとフォルダの中身をキャッシュするようになります。npmレポジトリのバージョンが上がったらキャッシュを更新します。しかし、npmにGitHubの固定URL(e.g. レポジトリURL/tarball/master)を指定すると、バージョンに変更が無いとみなされキャッシュを使用し続けます。

node_modulesを無視しないようにしたらキャッシュされないようになりますが、それはちょっと気持ち悪くて嫌だなと。 一度npmのレポジトリ指定先を元に戻して再度指定し直してみましたが、ちゃんとキャッシュされていました/(^o^)\

Heroku-repoでキャッシュ消せるしリビルドできた

というわけでHerokuのキャッシュ問題を解決するレポジトリがこちら。

heroku/heroku-repo · GitHub

Herokuを操作するための便利コマンドを追加してくれるプラグインです。

purge_cache

$ heroku repo:purge_cache -a アプリ名

キャッシュ消せます

rebuild

$ heroku repo:rebuild -a アプリ名

一度リモートレポジトリを空にして、レポジトリをpushし直します。

以上のコマンドによってHerokuでのnpmキャッシュ問題はうまく解決できました。HerokuとNode使っている方は陥りがちな問題だと思うのですが、スマートな解決策があってよかったです。