背景
表題の通り、開発をしていくとどうしてもランタイムが乱立しがちで管理が大変です。
miseをつかうと、各プログラミング言語のランタイムバージョン管理やプロジェクトごとの環境変数などを統合的に管理できるというものです。
似たツールでasdfというツールもありますが、miseはRust製ということもあり、実行速度が早いとのことです。
そしてdirenvという別のツールを組み合わせることで、各プロジェクトにcdするだけで指定のバージョンのランタイムを利用できるということでトライしてみました。
ここに手順等を備忘録がてら残しておきます。
miseでバージョンを指定してみる
インストール
シンプルに以下コマンドでインストールできます。
バイナリは ~/.local/bin/mise になります。
curl https://mise.run | sh
echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc
miseには、一時的な実行、グローバル固定、プロジェクト固定の3つのレベルがあります。
- 一時実行 (exec): インストールせずに最新版を試す
mise exec node@22 -- node -v
- グローバル設定 (use --global): PC全体で使うデフォルトを指定
mise use --global node@22 python@3.12
claude-codeのようなツールも、mise経由ならNode.jsの環境を汚さずに実行・管理できます
使い方
mise exec
mise exec ... で指定したツールをシェルから実行できます。
例えば、mise exec python@3 -- python というコマンドを実行すれば、おなじみのPythonのインタラクティブシェルが立ち上がります。
同様の手順でnodeでもいけます。
mise use
そして、mise ues --global ...を実行することで、指定したツールのバージョンがインストール・デフォルト使用できます。
例えば、mise use --global node@24 というコマンドを実行すれば、24のバージョンが使われるので、 mise exec -- node ... コマンドを実行すれば24のバージョンが利用されます。
mise activate
シェルから通常通り (mise関係なしに) コマンドを実行した際に、node 24を実行したい場合は、後述のactivateサブコマンドを使用する必要があります。
mise activate コマンドを使用することで、PATH環境変数が変更され、指定したバージョンのツールが利用できるようになります。
似たコマンドでmise shims コマンドというのもあります。activateはディレクトリ移動時にPATHを動的に書き換えるのに対し、shimsは固定のダミーバイナリを置くという違いがあります。
したがってshimsはCI/CDやIDEに推奨され、通常の利用はactivateが推奨されます。
さて、通常通りnodeと実行したとき、指定したバージョンのnodeが利用されるようにするためにはactivateサブコマンドを実行する必要があります。
冒頭すでに記載済みですが、シェルにbashを使用している場合は以下のコマンドを実行し、シェルが立ち上がるたびにmiseが呼び出されるようにします。
echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc
まとめると、mise use --global ... としておけば指定したツールとバージョンがシェルから実行できるようになるというところです。
たとえばclaude codeを実行する場合、以下の2パターンあります。
mise exec npm:@anthropic-ai/claude-code -- claude --version-
# miseの管理化にnodeが存在していること (以前mise use --global nodeを実行していればOK) mise use --global npm:@anthropic-ai/claude-code claude --version
環境変数の指定
mise.toml ファイルを用意することで、置かれたディレクトリ配下に移動した場合、セットする環境変数を指定できます。
ファイルの例を挙げると以下のとおりです。
[env]
NODE_ENV = "production"
タスク
npm run的なスクリプトの仕組みがmiseにも存在します。
ファイルの例を挙げると以下のとおりです。
[tasks]
hello = "echo hello from mise"
mise run hello を実行すると、hello from mise と表示されます。
direnvを使ってプロジェクトごとにバージョンを指定してみる
direnv と組み合わせることでプロジェクトごとにバージョンを指定できるようになります。
インストール
大体のディストリビューションでパッケージが登録されています。
私が使うFedoraであれば、dnf install direnv でインストールできます。
その後miseのようにシェルから呼び出されるよう設定する必要があります。
Bashの場合は以下のとおりです。
echo 'eval "$(direnv hook bash)"' >> ~/.bashrc
miseと組み合わせた使い方
プロジェクトのルートディレクトリで以下ファイルを作成します。
下の例だとnodeとpythonをインストールするという意味です。
※ファイルを保存したとき、 Config files in xxx are not trusted.というエラーが出ますが、後述のmise trust コマンドを実行するまでセキュリティ上処理しないというメッセージで、現段階では問題ありません。
[tools]
node = "25.7"
python = "3.14"
次にdirenvを使ってmiseを呼び出す設定です。
.envの内容を読み込みたい場合に備え、dotenv_if_existsも使用しています。
eval "$(mise env)"
# .env ファイルの内容も読み込みたい場合
dotenv_if_exists .env
ここまで来たら以下のコマンドを実行することで、設定した内容でインストールがされます。
mise trust および direnv allow については、mise.tomlと.envrcの処理を許可するコマンドです。セキュリティ上承認が必要な仕組みとなっています。
mise trust
mise install
direnv allow
なお、特定のディレクトリ配下を常に信頼させるには、グローバル設定(~/.config/mise/config.toml)に以下を追記します。
[settings]
trusted_config_paths = ["/tmp"]