Heroku へ初デプロイで引っかかった bundle install

More than 1 year has passed since last update.

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 を実行する。