0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RubyMine コミット時に `The engine "node" is incompatible` エラーが出た時の対処法

0
Posted at

背景

  • 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.jsonengines.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に変更

手順

  1. RubyMine → Settings (Cmd+,) → 言語&フレームワーク → JavaScript ランタイム を開く
  2. 「Node ランタイム」の右側の ... をクリック
  3. 一覧から ~/.local/share/mise/shims/node (22.16.0) を選択
  4. 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が内部的に保持している設定が原因で、シェル側の環境はいくら整えても関係なかった、というオチ

参考

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?