RubyMineで、「同一Rubyバージョンだけど、システム別に異なるgemバージョンを使いたい」場合の設定について調べてみた

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.

SDK gemsets | RubyMine

とありました。

そこで、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.

Bundler | RubyMine

とありました。プロジェクトで 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が起動しました。

 

ソースコード

今回使用した gem と Rails アプリはそれぞれGithubに上げました。