本番環境でのgemのインストールで少しハマったので備忘録として記録
これまでローカル環境でgemのインストールをする際に、development環境やtest環境のgemのインストールがなぜかうまくいかないという問題が発生していました。
本番環境では開発環境で使用するrubocopなどのgemってそもそもインストールする必要がないよなと思い、ローカル環境から一度立ち戻って確認してみることに。
ハマった点
1. 下記のようにGemfile内に記載されているgroup developmentやtest内のgemのインストールがうまくいかない。
group :development do
gem 'web-console', '>= 3.3.0'
gem 'listen', '>= 3.0.5', '< 3.2'
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
gem 'pry-rails'
gem 'pry-doc'
gem 'pry-byebug'
gem 'pry-stack_explorer'
gem 'pry-alias'
gem 'rb-readline'
# コーディング規約
gem 'rubocop', require: false
gem 'rubocop-performance', require: false
gem 'rubocop-rails', require: false
end
group :test do
gem 'capybara', '>= 2.15'
gem 'selenium-webdriver'
gem 'webdrivers'
end
2. project内の.bundle/config内の下記記述が削除しても、bundle installの度に追加されてしまう。
---
BUNDLE_PATH: "vendor/bundle"
BUNDLE_WITHOUT: "development:test"
原因調査
bundle configを実行することで、bundleの設定を確認することができます。
bundlerでは一度実行したオプションは保存されて、2度目以降の実行では自動でオプションを付加した状態で実行されているようです。
mbp13:sample_app user$ bundle config
Settings are listed in order of priority. The top value will be used.
path
Set for your local app (/Users/user/development/ams_app/.bundle/config): "vendor/bundle"
Set for the current user (/Users/user/.bundle/config): "vendor/bundle"
without
Set for your local app (/Users/user/dev/sample_app/.bundle/config): [:development, :test]
Set for the current user (/Users/user/.bundle/config): [:development, :test]
どうやらアプリ固有のbundle設定でも、ユーザ単位のbundle設定でもbundle install実行時にdevelopment環境やtest環境のどちらのgemもインストールしない設定となっているようですね。
解決方法
下記の2つのファイルからBUNDLE_WITHOUT: "development:test"の削除を行う。
/Users/user/dev/sample_app/.bundle/config
/Users/user/.bundle/config
※もちろん、PATHに含まれるuser,sample_appで表される「ユーザ名」、「アプリ名」についてはそれぞれの環境のものであると思います。
削除が完了したら、再度bundle configコマンドを実行して先ほどのbundleオプションの記述が消えていることを確認してください。
mbp13:sample_app user$ bundle config
Settings are listed in order of priority. The top value will be used.
path
Set for your local app (/Users/user/dev/sample_app/.bundle/config): "vendor/bundle"
Set for the current user (/Users/user/.bundle/config): "vendor/bundle"
ここまできたらこれまで同様にbundle installをしていただければ開発環境で使用したいgemがインストールできるかと思います。
bundle install実行後もこれまでとは異なり、BUNDLE_WITHOUT: "development:test"がconfingファイルに追加されることはありません。(bundle configで確認できます。)
本来アプリ単位でgemの管理を行うためのbundlerですが、より優先度の高いユーザのbundle configで常にdevelopmentとtestのgemはインストールしないという設定がされてしまっていたということですかね。
最後に
勉強し始めで色々なチュートリアルなどをする中で、コマンド実行してしまったんですかね。
初学者あるあるかと思いますが、コマンドを打つ前にコマンドの意味をちゃんと調べるのは大切ですね。最初に見つけたドキュメントに飛びついてとりあえずコマンドを打つのも後々苦しむことになったりすることもまた一つ勉強になりました。
本番環境ではBUNDLE_WITHOUTの設定を用いて、開発で使用していたgemをインストールしない設定にしておくのが本来の使い方何ですかね。
ご指摘などありましたらコメントよりよろしくお願いします。