rails Tutorial 『1.5 デプロイする』でやってしまったエラーの記録です。
こんなに丁寧にエラー出してくれるんだ…とちょっと感動しましたが、それは解決できてからですね。
『1.5.1 Herokuのセットアップ』で 本番環境用にgem を追記しましたが、本番用なので開発環境で実行が必要とは思っていませんでした。
リスト1.14で追加したgemは本番環境でしか使用しないので、このフラグを追加したコマンドを実行すると本番用gemはローカルに追加されません。今このコマンドを実行するのは、後の本番環境へのデプロイに備えてGemfile.lockを更新し、pg gemとrails_12factor gem、Rubyバージョンの指定をGemfile.lockに反映する必要があるためです。
後で見直すと「書いてる!」と気づくのですが、エラー出てからでないとこの意味に気づけませんでした。。。
なので、以下のコマンドを実行せずにチュートリアルの後のコマンドを入力していきました。
$ bundle install --without production
すると、
$ git push heroku master
で、
remote: You have added to the Gemfile:
remote: * pg (= 0.17.1)
remote: * rails_12factor (= 0.0.2)
remote: !
remote: ! Failed to install gems via Bundler.
remote: !
remote: ! Push rejected, failed to compile Ruby app.
remote:
remote: ! Push failed
remote: Verifying deploy...
remote:
remote: ! Push rejected to whispering-beyond-xxxxx.
remote:
とエラーを出して止まります。
ここで 「Failed to install gems via Bundler.」 を見て、さっき見た「bundle install ~」は実行が必要だったのかも…と気づきました。
$ bundle install --without production
を実行して、
$ git commit -a -m "Update gemfile.lock for heroku"
$ heroku create
$ git push heroku master
これでようやく Heroku 上で動いている「Hello, world!」を見ることができました。
新しく heroku create しちゃったので、前の失敗 apps が残ってしまいました。
上書きするコマンドを探すべきでした。。。
削除するのはHerokuのアプリをターミナルで削除するを参考にコマンドで削除しました。
$ heroku apps:destroy --app アプリ名 --confirm アプリ名
Bundlerを使ったGemパッケージの管理 に以下のような記述がありました。
先に記載したように「bundle install」を行なうと、「Gemfile」に書かれたGemパッケージと、そのGemパッケージが依存しているGemパッケージを自動的に調べて全てインストールしてくれます。「Gemfile.lock」はインストールされたGemパッケージの名前とバージョンが記録されたものです。
----- 中略 -----
他の環境で同じアプリケーションの開発を行なう場合は、プログラムファイルに加えてこの「Gemfile.lock」ファイルを配布します。そして他の環境で「bundle install」を実行すると、今度は「Gemfile.lock」ファイルが参照され、指定されたバージョンのGemパッケージがインストールされます。
このようにBundlerを使うことで、必要なGemパッケージを管理し、同じ開発環境を簡単に構築することができます。
なるほど。
Gemfile と Gemfile.lock の関係性がわかってなかったから、bundle install の実行が必要だと認識できなかったんですね。
まとめ
・ Gemfile を変更したら、とにかく bundle install を実行する。