mise(rtx)を対話的シェル以外で使うなら大人しくshimsにPATH通した方がいい

asdfコンパチのバージョン管理ツールrtxがmiseにリネームされていた - Acme::AnaTofuZ->new;に続いてmise(rtx)の小ネタ。

miseのセットアップではeval "$(~/.local/bin/mise activate zsh)"のようなものを.zshrcに書くだけで済むのが基本形になっている。 自分が操作しているターミナルで使う分には問題ないのだが、例えばVSCodeがmiseでいれたperlを呼び出したり、タスクランナーでnodeを動かそうとすると、yarn not foundみたいなエラーが出てくる。

これはmiseは他の*envと異なり、環境変数PATHそのものをダイナミックに書き換えることでバージョン管理を行っていることが影響している。 他のenv系はshimsと呼ばれるシェルスクリプトで環境ごとのコマンドを呼び出しており、環境変数PATHはshimsが集まっている場所にだけ通せば良い。 他方miseはmise自身がPATHを書き換えるので、静的にshimsをPATHに通さなくても動く。

これはこれで良いのだが、miseのactivateコマンドのヘルプにもある通りスクリプトで動かそうとすると問題がある

This is only intended to be used in interactive sessions, not scripts.

mise is only capable of updating PATH when the prompt is displayed to the user.

For non-interactive use-cases, use shims instead.

つまり対話的シェル以外の場合はmiseはPATHを通さないので、意図した通りに動かなくなる。 miseはこんなこともあろうかと、shimsのシェルスクリプト自体は作成してくれるので、この場所に大人しくPATHを通せば良い。

すなわち.zshrcを以下のようにすれば良い

eval "$(mise activate zsh)"
export PATH="$HOME/.local/share/mise/shims:$PATH"

こうするとスクリプト実行の場合はshimsが使用され、そうでない普段の対話的シェルの場合はmiseがダイナミックに張り替えたPATHが使われるのでパフォーマンスも問題なく普段の生活ができる。

他になんか楽なソリューションがあるきもするが、まぁ大人しくPATH通しておいたほうが*env系からの移行時には楽だろう。