HerokuのCedar stackでパッケージの依存関係がキャッシュされる罠にはまってみた
タイトルのとおりです。
Cedar stackをよく使っている人は知っていて当然のことなのかもしれませんが、自分は見事に罠にはまりました。
node-twitterというライブラリを使ってTwitterのStreaming APIを使ったアプリを作るのに、最初以下のようにpackage.jsonを書いていました。
{ "name": "twitter-photo-montage" , "version": "0.0.1" , "private": true , "dependencies": { "express": "2.5.1" , "ejs": ">= 0.0.1" , "twitter": "0.1.17" , "socket.io": "0.8.7" } }
バージョン0.1.17はnpmでインストールできるtwitter-nodeの最新バージョンです。
しかし、バーション0.1.17にはStreaming APIにHTTPS接続するためのパッチが当たっておらず503エラーを返してしまっていたので、package.jsonを変更して、作者とは別の人がGitHubに公開しているパッチ版を使用することにしました。
{ "name": "twitter-photo-montage" , "version": "0.0.1" , "private": true , "dependencies": { "express": "2.5.1" , "ejs": ">= 0.0.1" , "twitter": "https://github.com/rocketlabsdev/node-twitter/tarball/master" , "socket.io": "0.8.7" } }
ところが、上記のpackage.jsonをpushしても503エラーが返ってくる事象が一向に改善しません。
おかしいと思い調べてみたところ、こんな記事を発見しました。
Use versioned github tarballs to update dependencies on heroku cedar stack — Gist
Cedar stackはパッケージの依存関係をキャッシュしていて、パッケージのバージョンが変わっていないとキャッシュしたものを使用するとのこと。
今回の場合、別の人が公開しているパッチ版が未パッチ版と同じバージョン0.1.17として公開されていたため、Cedar stack側が同じパッケージと見なして、キャッシュしたもの使っていたようです。
いったんtwitter-nodeのバーションを0.1.16に下げてpushしたあとで、再度パッチ版に変えてpushしたら、今度は無事パッケージが更新されました。
うーん。Herokuの日本語ドキュメントがほしい。