本番環境での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をインストールしない設定にしておくのが本来の使い方何ですかね。
ご指摘などありましたらコメントよりよろしくお願いします。