mise installしてもコマンドの実体が切り替わらない

mise.tomlにツールを記述してmise installを実行しても、シェルで直接コマンド名を打ったときに使われる実体は自動的には切り替わらない。jqのようにシステムにも同名のコマンドがインストール済みの場合、そちらが優先されたままになる。mise activateをシェルに組み込むと、ディレクトリごとにmise.tomlで指定したバージョンへコマンドの解決先が自動的に切り替わる。

mise activateの基本

mise activateは使っているシェルの種類を引数に取り、そのシェル用の初期化スクリプトを出力する。出力をそのまま評価すると、現在のシェルセッションに対してmiseが有効になる。

$ eval "$(mise activate zsh)"

シェルを起動するたびに評価されるよう、設定ファイルへ追記しておく。

$ echo 'eval "$(mise activate zsh)"' >> ~/.zshrc

bashなら~/.bashrc、fishなら~/.config/fish/config.fishのように、使っているシェルに応じた設定ファイルへ追記する。

ディレクトリを移動するとコマンドの解決先が自動的に切り替わる

mise activateはプロンプト表示やディレクトリ移動のタイミングでフックし、PATHや環境変数を現在のディレクトリのmise.tomlに合わせて更新する。プロジェクトのmise.tomljqのバージョン1.6を指定した状態で挙動を確認する。

[tools]
jq = "1.6"

mise activateを組み込む前は、システムにインストールされたjqが使われる。

$ jq --version
jq-1.7.1

mise activateを組み込んだ状態でプロジェクトのディレクトリに入ると、mise.tomlで指定したバージョンに切り替わる。

$ cd /path/to/project
$ jq --version
jq-1.6

プロジェクトの外に出ると、システムのjqに戻る。

$ cd /tmp
$ jq --version
jq-1.7.1

シムを使う方式との違い

mise activateの代わりにmise activate --shimsを使う方式もある。シムはツール名と同じ名前で~/.local/share/mise/shimsに生成される、mise本体へのシンボリックリンクである。~/.local/share/mise/shimsをPATHの先頭に加えるだけなので、シェルのフックが動かないスクリプトや非対話的な環境でも動作する。

ただしmise activate --shimsmise activateが持つ機能の一部をサポートしない。シムはコマンド実行時にだけ環境変数を読み込むため、cdをトリガーにしたフックの大部分は動作しない。which jqのようなコマンドもシムのパスを返すだけで、実際のツールのパスは分からない。対話的なシェルではmise activateを、CIのような非対話的な環境ではシムやmise execを使い分けるとよい。