RubyMineで開発をする中で、「同一Rubyバージョンだけど、システム別に異なるgemバージョンを使いたい」ことがあったため、メモを残します。
目次
環境
- rbenvでRubyをインストール
- 今回は 2.7.4 を使用
- RubyMine 2021.3
- Railwaysプラグインを使いたいため、手元では古いバージョンを使っています
- JetBrainsのサイトを見る限り、最新バージョンでも同じはず
- Rails 7.0.3
- システム別に異なるgemバージョンを試すためのRailsアプリを用意
システムごとに異なるgemのバージョンを試すため、今回は自作gemを用意し、Githubに置いておきます。
https://github.com/thinkAmi-sandbox/ruby_hello_world_gem
このリポジトリには3つのタグを置いてあります。
https://github.com/thinkAmi-sandbox/ruby_hello_world_gem/tags
3つのタグの違いは、 HelloWorld::Message.call
した時に
- 1.0.0は
Hello, world!
- 2.0.0は
hey
- 3.0.0は
bye
がそれぞれ返るものとします。
また、用意したRailsアプリは bundle install
しない限り、画像のように RubyMine で Rails が起動できない状態であるとします。
他に、パターンごとにそれぞれ別の Rails アプリを用意します。
パターンごとの設定
rbenv-gemset を使用するパターン
RubyMineのドキュメントを見ると、
RubyMine provides the capability to work with gemsets for the RVM and rbenv version managers. Note that this functionality is supported only for local interpreters.
とありました。
そこで、RubyMineで rbenv-gemset
を使って設定してみます。
jf/rbenv-gemset: KISS yet powerful gem / gemset management for rbenv
rbenv-gemset
のREADMEに従い、Githubからインストールします。
https://github.com/jf/rbenv-gemset
rbenv-gemset
の初期化を行います。
% rbenv gemset init created rubymine_sdk_gemsets for 2.7.4 created and initialized the following gemset for use with 2.7.4 ===== rubymine_sdk_gemsets =====
続いて、Preferences > Languages & Frameworks > Ruby SDK and Gems
より、プロジェクトの rbenv-gemset を有効化します。
今回は Ruby 2.7.4 を使うため、ラジオボタンで Ruby 2.7.4 を選択し、 rubymine_sdk_gemsets
にチェックを入れます。
この状態で bundle install
します。
% bundle install ... Bundle complete! 7 Gemfile dependencies, 56 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed.
再度、RubyMinde の Ruby SDK and Gems を見ると、各 gem が rbenv-gemset にインストールされていることがわかります。
なお、bundle config に path
が設定されている場合は、 rbenv-gemset よりも bundle config の設定が優先されます。
プロジェクトの vendor/bundle へ入れるパターン
RubyMineのドキュメントの目次にはありませんが、 Bundler の install gems
の項目に
--path vendor/bundle
: install gems to the vendor/bundle project directory. In this case, Bundler adds the .bundle/config file to a project’s root. RubyMine processes this configuration file to detect that gems are installed into vendor/bundle.
とありました。プロジェクトで vendor/bundle
に入れた場合にも対応していそうです。
そこで、まずはグローバルな bundle config にて path
を設定してみます。
# 設定 % bundle config set --global path "vendor/bundle" # 確認 % bundle config ... path Set for the current user (/Users/<user_name>/.bundle/config): "vendor/bundle"
続いて、 bundle install
します。
# インストール % bundle install ... Bundle complete! 7 Gemfile dependencies, 56 gems now installed. Bundled gems are installed into `./vendor/bundle` # 確認 % bundle exec gem list *** LOCAL GEMS *** actioncable (7.0.3) ... hello_world (2.0.0) ... rails (7.0.3) ... zeitwerk (2.6.0)
これで vendor/bundle
に gem が入ったようですが、インストール直後は SDK としては認識されていないようです。
そこで、 bundle config にて、 local 設定を追加します。
Bundler: bundle config
# 設定 % bundle config set --local path "vendor/bundle" # 確認 % bundle config ... path Set for your local app (/path/to/.bundle/config): "vendor/bundle" Set for the current user (/Users/<user_name?/.bundle/config): "vendor/bundle"
すると、再度 RubyMineで index が走り、 vendor/bundle
の gem が認識されました。
ちなみに、RubyMineでプロジェクトを開き直すと認識されました。
ただ、ドキュメントの記載とは異なるため、これが正しい挙動かは不明です。
グローバル (system) にgemを入れるパターン
まずは、bundle config で path
が存在しないことを確認します。もし、bundle config で path
が設定していた場合は、 unset します。
# 設定を確認 % bundle config # もし path 設定があれば削除する % bundle config unset --global path
続いて、 bundle install
します。
# インストール % bundle install ... Bundle complete! 7 Gemfile dependencies, 56 gems now installed. Use `bundle info [gemname]` to see where a bundled gem is installed.
インストール後、 RubyMine の index が走り終わると、Ruby SDKの各 gem が認識されます。また、Railsも問題なく起動できます。
ちなみに、システムにgemを入れた後、以前設定した rbenv-gemset プロジェクトにて Ruby SDK and Gems を確認すると、以下のような表示となっていました。
システムのgemと rbenv gemset の gem がそれぞれ認識されているようです。
動作確認
それぞれ別のポートで Rails を起動後、 curl でアクセスするとそれぞれ別バージョンの gem で動作しているようでした。
% curl http://localhost:3000/hello_worlds {"message":"Hello, world!"} % curl http://localhost:3002/hello_worlds {"message":"hey"} % curl http://localhost:3003/hello_worlds {"message":"bye"}
その他:RubyMineの project SDK とは何か調べる
RubyMine の Run/Debug Configurations を見ると、 Use project SDK
という記載があります。
project SDK
とは何かを RubyMine のドキュメントで調べてみましたが、それらしい記述は見当たりませんでした。
ただ、今回色々動かしてみたところ、 Preferences の Ruby SDK and Gems
で選択している Ruby SDK を指しているようでした。
例えば、Railsが入っていない SDK を選択してみると、Railsが起動しませんでした。一方、 Rails が入っている SDK を選択すると、Railsが起動しました。