背景
- RubyMineからGitコミットしようとした際に、Node.jsのバージョン不一致エラーが発生し、コミットできない状態に遭遇
- ターミナルでは正しいバージョンが使われているのに、RubyMine経由だと古いバージョンを参照してしまう、という少しハマりやすい問題だったので備忘録として残しておく
mise + RubyMine + Husky系のpre-commit hook を使っている方の参考になれば幸いです
環境
- macOS
- RubyMine 2025.3
- mise (Node.jsバージョン管理)
- yarn 1.22.22
- プロジェクト指定のNode.js: 22.x
エラー内容
RubyMineのコミットダイアログからコミットを実行すると、以下のエラーが出てコミットが中断された
yarn run v1.22.22
error sonic@: The engine "node" is incompatible with this module. Expected version "22.x". Got "20.11.0"
error Commands cannot run with an incompatible environment.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
pre-commit hookの中で yarn が実行され、package.json の engines.node フィールドで指定されたバージョン(22.x)と、実行環境のNode.js(20.11.0)が一致しないために落ちている、というのがエラーの直接の原因
原因
ターミナルでは正しいバージョンが使われている
まず、ターミナルで確認したところ、Node.jsのバージョンは問題ない
$ node -v
v22.16.0
$ which node
/Users/user/.local/share/mise/installs/node/22.16.0/bin/node
$ mise which node
/Users/user/.local/share/mise/installs/node/22.16.0/bin/node
miseで管理しているNode.js 22.16.0がきちんと使われています。つまり、ターミナルでは正しい環境が整っていたということ
RubyMineが古いNode.jsを参照していた
一方で、RubyMineの設定画面(Settings → 言語&フレームワーク → JavaScript ランタイム)を確認すると、Node ランタイムが以下を指していた
~/.local/share/mise/installs/node/20.11.0/bin/node
以前miseで入れていた古いNode 20.11.0を、RubyMineが設定として覚えたままになっていた。RubyMineはGitフックを実行する際、この設定されたNode.jsを使うため、pre-commit hook内で呼ばれるyarnが20.11.0で動いてしまい、engines チェックに引っかかっていた、という構造
なぜ気づきにくいのか
ターミナルとGUIアプリ(RubyMine)は、環境変数やPATHを別々に持っている
- ターミナル:
.zshrcを読み込み、miseが有効化されている - GUIアプリ:
.zshrcを読まず、アプリ自身の設定やmacOSのGUI環境のPATHを参照する
さらにRubyMineの場合、一度「Node interpreter」として選択したパスを設定として保存するため、miseで新しいバージョンに切り替えても、RubyMineは古いパスを指し続けるという現象が起きる
最初は .zprofile にmiseのactivateを追加する方向で試していましたが、それでも解決しなかった。原因はシェルのPATH設定ではなく、RubyMine内部のNode interpreter設定だったため
解決策
RubyMineの設定で、Node ランタイムをmiseのshimsに変更
手順
- RubyMine → Settings (Cmd+,) → 言語&フレームワーク → JavaScript ランタイム を開く
- 「Node ランタイム」の右側の
...をクリック - 一覧から
~/.local/share/mise/shims/node(22.16.0) を選択 - OK → 適用 → OK
なぜ installs/22.16.0 ではなく shims を選ぶのか
一覧には以下のような選択肢が出てきます。
| パス | 説明 |
|---|---|
~/.local/share/mise/installs/node/22.16.0/bin/node |
特定バージョンへの直接パス |
~/.local/share/mise/shims/node |
miseのshims(バージョン自動解決) |
~/Library/Application Support/JetBrains/RubyMine2025.3/node/versions/22.15.0/bin/node |
RubyMineが内蔵しているNode |
shimsを選ぶのがおすすめ 理由は以下の通り
- プロジェクトの
.tool-versionsや.mise.tomlを自動で読んで、適切なバージョンを選んでくれる - Node.jsを22.17.0や24.xにアップデートしても、このパスのままで追従する
- プロジェクトごとに異なるバージョンが指定されていても自動で切り替わる
一方、installs/22.16.0/bin/node を直接指定すると、将来バージョンを上げた時に再度設定を変えないといけない
(任意) 不要なNode.jsを削除
もう使わないNode 20.11.0は、miseから削除するとスッキリ
# 他のプロジェクトで使っていないか確認
mise ls node
# 問題なければ削除
mise uninstall node@20.11.0
また、RubyMineのNode ランタイム一覧に残っている古いエントリ(~/.nodenv/shims/node のような赤字表示になっている存在しないパスなど)は、設定画面の「ー」ボタンで削除できる
まとめ
- エラーの直接原因: pre-commit hookで呼ばれるyarnが、プロジェクトが要求するNode 22.xではなくNode 20.11.0で動いていた
- 根本原因: RubyMineのNode interpreter設定が、過去にインストールしていた古いバージョンのパスを保持し続けていた
-
解決策: RubyMineの「JavaScript ランタイム」設定で、miseのshimsパス(
~/.local/share/mise/shims/node)を選択する - ポイント: ターミナルとGUIアプリは環境が別。ターミナルで動いてもRubyMineで動くとは限らない
感想
- 最初は
.zshrc/.zprofileの設定問題だと思い込んでいて、そちらばかり確認してしまった - 実際には、RubyMineが内部的に保持している設定が原因で、シェル側の環境はいくら整えても関係なかった、というオチ