😶‍🌫️

【2024年12月最新版】RubyMine + mise + direnv で Ruby on Rails の開発をするときの設定

2024/12/13に公開

2024年12月中旬、ある日突然 RubyMine 上で RSpec を実行できなくなってしまった。
具体には RubyMine で開発しているプログラマーなら誰もが一度は目にする以下のメッセージが出るようになった。

cannot load such file -- teamcity/spec/runner/formatter/teamcity/formatter

だいたいこれが出るときは iTerm から起動してしまった Spring などにより、RubyMineのライブラリにロードパスの通っていないプロセスが存在する故のエラーが多かったのだけれど、今般のエラーはどうにも解消できない。

試行錯誤のうえ、以下の設定をおこなって mise.toml にて環境変数を上書きすることにより解消した

mise set RUBYLIB=${RUBYLIB}:${HOME}/Applications/RubyMine.app/Contents/plugins/ruby/rb/testing/patch/common:${HOME}/Applications/RubyMine.app/Contents/plugins/ruby/rb/testing/patch/bdd:${HOME}/Applications/RubyMine.app/Contents/plugins/ruby/rb/testing/patch/rake:${HOME}/Applications/RubyMine.app/Contents/plugins/ruby/rb/testing/patch/testunit

ここからはログ

はじめは RubyMine の RSpec テンプレートに、ruby の引数として以下の文字列を入れていたが問題が解消しなかった。

-I/Users/motchang/Applications/RubyMine.app/Contents/plugins/ruby/rb/testing/patch/common
-I/Users/motchang/Applications/RubyMine.app/Contents/plugins/ruby/rb/testing/patch/bdd
-I/Users/motchang/Applications/RubyMine.app/Contents/plugins/ruby/rb/testing/patch/rake
-I/Users/motchang/Applications/RubyMine.app/Contents/plugins/ruby/rb/testing/patch/testunit

ここで一度 rbenv (anyenv) で入れた ruby をプロジェクトのランタイムに変更してみたところ問題が解消し、ふたたび mise に戻したらちゃんと動いた(ように錯覚していた)ので数日このまま放置したが、再度テストを動かそうとするとまたエラーが再発してしまった。

iTerm でプロジェクトのディレクトリまで移動し、irb の引数に上記文字列を入れて実行するとしっかり RubyMine のライブラリへパスは通っていることがわかった。

irb -I/Users/motchang/Applications/RubyMine.app/Contents/plugins/ruby/rb/testing/patch/common \
-I/Users/motchang/Applications/RubyMine.app/Contents/plugins/ruby/rb/testing/patch/bdd \
-I/Users/motchang/Applications/RubyMine.app/Contents/plugins/ruby/rb/testing/patch/rake \
-I/Users/motchang/Applications/RubyMine.app/Contents/plugins/ruby/rb/testing/patch/testunit
irb(main):001> $:
=>
["/Users/motchang/Applications/RubyMine.app/Contents/plugins/ruby/rb/testing/patch/common",
 "/Users/motchang/Applications/RubyMine.app/Contents/plugins/ruby/rb/testing/patch/bdd",
 "/Users/motchang/Applications/RubyMine.app/Contents/plugins/ruby/rb/testing/patch/rake",
 "/Users/motchang/Applications/RubyMine.app/Contents/plugins/ruby/rb/testing/patch/testunit",
 "/Users/motchang/.local/share/mise/installs/ruby/3.3.6/lib/rubygems_plugin",
 "/Users/motchang/.local/share/mise/installs/ruby/3.3.6/lib/ruby/gems/3.3.0/gems/irb-1.14.1/lib",
 "/Users/motchang/.local/share/mise/installs/ruby/3.3.6/lib/ruby/gems/3.3.0/gems/io-console-0.7.2/lib",
 "/Users/motchang/.local/share/mise/installs/ruby/3.3.6/lib/ruby/gems/3.3.0/extensions/arm64-darwin-23/3.3.0/io-console-0.7.2",
 "/Users/motchang/.local/share/mise/installs/ruby/3.3.6/lib/ruby/gems/3.3.0/gems/reline-0.5.12/lib",
 "/Users/motchang/.local/share/mise/installs/ruby/3.3.6/lib/ruby/gems/3.3.0/gems/date-3.4.0/lib",
 "/Users/motchang/.local/share/mise/installs/ruby/3.3.6/lib/ruby/gems/3.3.0/extensions/arm64-darwin-23/3.3.0/date-3.4.0",
 "/Users/motchang/.local/share/mise/installs/ruby/3.3.6/lib/ruby/gems/3.3.0/gems/stringio-3.1.2/lib",
 "/Users/motchang/.local/share/mise/installs/ruby/3.3.6/lib/ruby/gems/3.3.0/extensions/arm64-darwin-23/3.3.0/stringio-3.1.2",
 "/Users/motchang/.local/share/mise/installs/ruby/3.3.6/lib/ruby/gems/3.3.0/gems/psych-5.2.1/lib",
 "/Users/motchang/.local/share/mise/installs/ruby/3.3.6/lib/ruby/gems/3.3.0/extensions/arm64-darwin-23/3.3.0/psych-5.2.1",
 "/Users/motchang/.local/share/mise/installs/ruby/3.3.6/lib/ruby/gems/3.3.0/gems/rdoc-6.8.1/lib",
 "/Users/motchang/.local/share/mise/installs/ruby/3.3.6/lib/ruby/site_ruby/3.3.0",
 "/Users/motchang/.local/share/mise/installs/ruby/3.3.6/lib/ruby/site_ruby/3.3.0/arm64-darwin23",
 "/Users/motchang/.local/share/mise/installs/ruby/3.3.6/lib/ruby/site_ruby",
 "/Users/motchang/.local/share/mise/installs/ruby/3.3.6/lib/ruby/vendor_ruby/3.3.0",
 "/Users/motchang/.local/share/mise/installs/ruby/3.3.6/lib/ruby/vendor_ruby/3.3.0/arm64-darwin23",
 "/Users/motchang/.local/share/mise/installs/ruby/3.3.6/lib/ruby/vendor_ruby",
 "/Users/motchang/.local/share/mise/installs/ruby/3.3.6/lib/ruby/3.3.0",
 "/Users/motchang/.local/share/mise/installs/ruby/3.3.6/lib/ruby/3.3.0/arm64-darwin23"]

何もしていない状態だとプロジェクトのディレクトリで環境変数を参照すると以下のようになる

RUBYLIB=${HOME}/.local/share/mise/installs/ruby/3.3.6/lib/rubygems_plugin

envrc を使っているので .envrc ファイルを以下のように書き換えて RUBYLIB 環境変数に RubyMine のライブラリパスを追加しようとしたが、意図通り動作することはなかった。どうやら cd をして envrc が発火するタイミングと mise の発火するタイミングの兼ね合いで mise の処理が後勝ちをしているようだ。

export RUBYLIB=${RUBYLIB}:${HOME}/Applications/RubyMine.app/Contents/plugins/ruby/rb/testing/patch/common:${HOME}/Applications/RubyMine.app/Contents/plugins/ruby/rb/testing/patch/bdd:${HOME}/Applications/RubyMine.app/Contents/plugins/ruby/rb/testing/patch/rake:${HOME}/Applications/RubyMine.app/Contents/plugins/ruby/rb/testing/patch/testunit

ここまで試し、 mise の機能で環境変数を上書きできるものがあった記憶をたどり冒頭の解決策に至った。

インターネットを探したけれど自分と同じような組み合わせでハマっている記事はまだないようだったので久し振りにメモを書いてみた。最近毎日 mise self-update --yes && mise upgrade && mise reshim を動かしているので一過性のものかもしれない。

Discussion