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

  • 0
    いいね
  • 0
    コメント

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