初心者の初心者による初心者のための開発環境セットアップツール mise 入門（updated from rtx）


# はじめに

バージョン管理ツール `rtx` がリリースされてからざっと 1 年半が経過しました。その間、このツールは度重なるアップデートを重ね、利便性を向上させていきました。また、名称も検索のしづらい `rtx` から `mise` (mise-en-place) へと変更しました。
こうして変遷を重ねていく中で、私が以前執筆した[入門記事](https://qiita.com/skyblue-jpn/items/44f762252ff80f9e4fc1)の内容もだいぶ古くなってきたと思うので、改めて[公式ドキュメント](https://mise.jdx.dev)を参考に使い方をまとめてみようと思います（ユーザーが増える中で私の記事も一定数読まれているようです。ありがとうございます）。

# mise とは

"_The front-end to your dev env_"（_開発環境のフロントエンド_）

もともとこのツールは `asdf` の `rust` クローンとして開発されたものでしたが、今では

-   `asdf` のように（あるいは `nvm` や `pyenv` のように、どの言語でも）、`node`、`python`、`cmake`、`terraform` など数百もの開発ツールを管理する。
-   `direnv` のように、様々なプロジェクトディレクトリの環境変数を管理する。
-   `make` のように、プロジェクトのビルドやテストに使うタスクを管理する。

と、よりマルチに開発環境を整えることができるようになっています（本稿では以前のようにバージョン管理機能を中心に扱います）。
ちなみに、正式名称は "mise-en-place" で "MEEZ ahn plahs" と発音するそうです。

# 注意事項

以下の説明は私の環境における現時点での最新版（2024.9.1 linux-x64）での説明になります。ご了承ください。

```shell-session:sh
$ mise --version
2024.9.1 linux-x64 (2024-09-10)
```

# 導入方法

公式ドキュメントにある導入方法をまとめていきたいと思います。

## mise CLI のインストール

### スタンドアローン

パッケージマネージャを使わない場合はこちらの方法を用います。

```shell-session:sh
$ curl https://mise.run | sh
$ ~/.local/bin/mise --version
mise 2024.x.x
```

:::note
"~/.local/bin" が PATH にある必要はありません。`mise` は自動的に自身のディレクトリを PATH に追加します。
:::

シェルスクリプトを使いたくない場合は以下のコマンドを実行します。

```sh:sh
curl https://mise.jdx.dev/mise-latest-macos-arm64 > ~/.local/bin/mise
chmod +x ~/.local/bin/mise
```

置き場所はどこでもいいので、適宜 `~/bin`, `/usr/local/bin`, `~/.local/bin` などと読み替えてください。また、ダウンロード先の URL も os やアーキテクチャに応じて適宜読み替えてください。対応している os・アーキテクチャは以下のとおりです。

-   `macos-x64`
-   `macos-arm64`
-   `linux-x64`
-   `linux-x64-musl`
-   `linux-arm64`
-   `linux-arm64-musl`
-   `linux-armv6`
-   `linux-armv6-musl`
-   `linux-armv7`
-   `linux-armv7-musl`

それ以外が必要な場合は `cargo install mise` でコンパイルしてください（後述）。

### apk

Alpine Linux でのインストール

```sh:sh
apk add mise
```

mise はコミュニティレポジトリに登録されています。

### apt

Ubuntu/Debian でのインストール

```sh:sh
# amd64
apt update -y && apt install -y gpg sudo wget curl
sudo install -dm 755 /etc/apt/keyrings
wget -qO - https://mise.jdx.dev/gpg-key.pub | gpg --dearmor | sudo tee /etc/apt/keyrings/mise-archive-keyring.gpg 1> /dev/null
echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.gpg arch=amd64] https://mise.jdx.dev/deb stable main" | sudo tee /etc/apt/sources.list.d/mise.list
sudo apt update
sudo apt install -y mise
```

```sh:sh
# arm64
apt update -y && apt install -y gpg sudo wget curl
sudo install -dm 755 /etc/apt/keyrings
wget -qO - https://mise.jdx.dev/gpg-key.pub | gpg --dearmor | sudo tee /etc/apt/keyrings/mise-archive-keyring.gpg 1> /dev/null
echo "deb [signed-by=/etc/apt/keyrings/mise-archive-keyring.gpg arch=arm64] https://mise.jdx.dev/deb stable main" | sudo tee /etc/apt/sources.list.d/mise.list
sudo apt update
sudo apt install -y mise
```

### aur

Arch Linux でのインストール

```sh:sh
git clone https://aur.archlinux.org/mise.git
cd mise
makepkg -si
```

AUR ヘルパーを使ったインストールも可能です。

### Cargo

Cargo によるソースコードからのビルド

```sh:sh
cargo install mise
```

cargo-binstal による高速化

```sh:sh
cargo install cargo-binstall
cargo binstall mise
```

main における最新のコミットからのビルド

```sh:sh
cargo install mise --git https://github.com/jdx/mise --branch main
```

### dnf

Fedora、CentOS、Amazon Linux、RHEL、その他 dnf ベースのディストリビューションでのインストール

```sh:sh
dnf install -y dnf-plugins-core
dnf config-manager --add-repo https://mise.jdx.dev/rpm/mise.repo
dnf install -y mise
```

### Docker

```sh:sh
docker run jdxcode/mise x node@20 -- node -v
```

### Homebrew

```sh:sh
brew install mise
```

### npm

mise は npm においてコンパイル済みバイナリとして利用可能です。これは単に npm によって配布されているだけであり Node.js パッケージではありません。これは、`package.json` や `npx` を使って mise をセットアップしたい JS プロジェクトにおいて有用です。

```sh:sh
npm install -g @jdxcode/mise
```

フルインストールすることなく単一のコマンドを試したい場合は `npx` を用いてください。

```sh:sh
npx @jdxcode/mise exec python@3.11 -- python some_script.py
```

### GitHub Releases

GitHub からの最新バージョンのダウンロード

```sh:sh
curl https://github.com/jdx/mise/releases/download/v2024.1.0/mise-v2024.1.0-linux-x64 > /usr/local/bin/mise
chmod +x /usr/local/bin/mise
```

### MacPorts

```sh:sh
sudo port install mise
```

### nix

Nix パッケージマネージャーの 23.05 リリース以降

```sh:sh
nix-env -iA mise
```

直接 `mise-flake.packages.${system}.mise` を用いることによりパッケージをインポートすることもできます。これはすべてのデフォルト Nix システムをサポートします。

### yum

```sh:sh
yum install -y yum-utils
yum-config-manager --add-repo https://mise.jdx.dev/rpm/mise.repo
yum install -y mise
```

### Windows

最新のリリースを GitHub からダウンロードし、バイナリを PATH に追加し、PATH が shims ディレクトリを含むよう編集します（デフォルトでは `%USERPROFILE%\.local\share\mise\shims`）。
Windows のサポートは現在のところ非常に限定的であることに留意してください。

## mise を使用可能にする

以下のいずれかの方法を用います

### 方法その 1：mise activate を用いる

`mise activate` を rc ファイルに書き込み、アクティベートします。シェルに応じて以下のコマンドを実行します。実行後はシェルを再起動してください。

```sh:bash
echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc
```

```sh:zsh
echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrc
```

```sh:fish
echo '~/.local/bin/mise activate fish | source' >> ~/.config/fish/config.fish
```

### 方法その 2：shims を PATH に追加する

以下の方法を用いることで mise をアクティベートせずに利用することができます。書き込む先として .bashrc/.zshrc を .bash_profile/.zprofile の代わりに用いることも可能です。

```sh:bash
echo 'export PATH="$HOME/.local/share/mise/shims:$PATH"' >> ~/.bash_profile
```

```sh:zsh
echo 'export PATH="$HOME/.local/share/mise/shims:$PATH"' >> ~/.zprofile
```

```sh:fish
fish_add_path ~/.local/share/mise/shims
```

# 基本的な使い方

## バージョンの確認

まず、無事にインストールできたかの検証もかねて試しにバージョンを確認してみます。

```shell-session:sh
$ mise --version
2024.9.1 linux-x64 (2024-09-10)
```

このような表示が出れば成功です。

## 実際に開発ツールをインストールしてみる

実際に開発ツールをインストールします。ここでは前回同様 Python を例にします。

### プラグイン一覧の表示

インストール可能なプラグインを確認します。

```shell-session:sh
$ mise plugins ls-remote
1password-cli
aapt2
act

...

zola
zoxide
zprint
```

なお、`mise plugins install name_of_plugin` によってプラグインを単独でインストールできますが、他のコマンド実行時に必要であれば自動でインストールされますのであまり気にしなくても大丈夫です。また、コミュニティ開発プラグインをインストールする際は確認画面が出ますのでその際は Yes を選択してください。

### インストール可能なバージョンの表示

インストール可能なバージョンを確認します。

```shell-session:sh
$ mise ls-remote python
activepython-2.7.14
activepython-3.5.4
activepython-3.6.0

...

3.13t-dev
3.14-dev
3.14t-dev
```

### 特定の Python のインストール

特定のバージョンの Python をインストールします。

```sh:sh
mise install python@3.12.6 # 特定のバージョンをインストールする場合
mise install python@3.12 # プレフィックスに一致するバージョンをインストールする場合
mise install python@latest # 最新のバージョンをインストールする場合
```

### 使用するバージョンの設定

特定のバージョンをグローバルに適用する場合、以下のコマンドを実行します。

```sh:sh
mise use -g python@3.12
```

また、現在のディレクトリにのみ適用する場合、以下のコマンドを実行します。

```sh:sh
mise use python@3.12
```

なお、これらのコマンドはまだインストールしていないバージョンに対して実行した場合も実行されるため、インストールしたバージョンをすぐにグローバルあるいはローカルに適用したい場合、`mise install` の実行は不要です。

インストールしたバージョンの一覧は以下のコマンドで確認できます。

```shell-session:sh
$ mise ls
Tool    Version  Config Source                         Requested
python  3.11.9   /path/to/working/directory/.mise.toml 3.11
python  3.12.6   ~/.config/mise/config.toml            latest
```

_Config Source_ で示されているファイルにコマンドで指定した内容が書き込まれています。ファイル形式は `mise use` で指定した場合 `toml` 形式です。こちらのファイルを直接編集したり、削除したりすることで設定を変更することも可能です。その場合、`mise install` の実行によって不足したバージョンをインストールすることもできます。

:::note warn
asdf のように `mise local` `mise global` によってバージョンの指定をすることも可能ですが、その場合生成される設定ファイルが `.tool-versions` になり、プレーンテキスト形式となるためあまりおすすめしません（公式で非推奨となっています）。
:::

### バージョン・プラグインの削除

バージョンの削除をしたい場合、以下のコマンドを実行します。

```sh:sh
rtx uninstall python@3.12
```

プラグインの削除をしたい場合、以下のコマンドを実行します。

```sh:sh
rtx plugins uninstall name_of_plugin
```

:::
bun、deno、erlang、go、java、node、python、ruby、zig に関してはプラグインが組み込まれているため、明示的にに上書きしない限りはプラグインのインストールがされることはありません。同様に、アンインストールもできません。
:::

# コマンド一覧

最後に `mise --help` と入力して mise のコマンドを概観してみようと思います。

```shell-session:sh
$ mise --help
mise is a tool for managing runtime versions. https://github.com/jdx/mise

It's a replacement for tools like nvm, nodenv, rbenv, rvm, chruby, pyenv, etc.
that works for any language. It's also great for managing linters/tools like
jq and shellcheck.

It is inspired by asdf and uses asdf's plugin ecosystem under the hood:
https://asdf-vm.com/

Usage: mise [OPTIONS] <COMMAND>

Commands:
  activate     Initializes mise in the current shell session
  alias        Manage aliases [aliases: a]
  backends     Manage backends [aliases: b]
  bin-paths    List all the active runtime bin paths
  cache        Manage the mise cache
  completion   Generate shell completions
  config       [experimental] Manage config files [aliases: cfg]
  current      Shows current active and installed runtime versions
  deactivate   Disable mise for current shell session
  direnv       Output direnv function to use mise inside direnv
  doctor       Check mise installation for possible problems [aliases: dr]
  env          Exports env vars to activate mise a single time [aliases: e]
  exec         Execute a command with tool(s) set [aliases: x]
  generate     [experimental] Generate files for various tools/services [aliases: gen]
  implode      Removes mise CLI and all related data
  install      Install a tool version [aliases: i]
  latest       Gets the latest available version for a plugin
  link         Symlinks a tool version into mise [aliases: ln]
  ls           List installed and active tool versions [aliases: list]
  ls-remote    List runtime versions available for install
  outdated     Shows outdated tool versions
  plugins      Manage plugins [aliases: p]
  prune        Delete unused versions of tools
  registry     [experimental] List available tools
  reshim       rebuilds the shim farm
  run          [experimental] Run a tasks [aliases: r]
  self-update  Updates mise itself
  set          Manage environment variables
  settings     Manage settings
  shell        Sets a tool version for the current session [aliases: sh]
  sync         Add tool versions from external tools to mise
  tasks        [experimental] Manage tasks [aliases: t]
  trust        Marks a config file as trusted
  uninstall    Removes runtime versions [aliases: remove, rm]
  unset        Remove environment variable(s) from the config file
  upgrade      Upgrades outdated tool versions [aliases: up]
  usage        Generate a usage CLI spec
  use          Install tool version and add it to config [aliases: u]
  version      Show mise version
  watch        [experimental] Run a tasks watching for changes [aliases: w]
  where        Display the installation path for a runtime
  which        Shows the path that a bin name points to
  help         Print this message or the help of the given subcommand(s)

Options:
  -C, --cd <DIR>
          Change directory before running command

  -P, --profile <PROFILE>
          Set the profile (environment)

  -q, --quiet
          Suppress non-error messages

  -v, --verbose...
          Show extra output (use -vv for even more)

  -y, --yes
          Answer yes to all confirmation prompts

  -h, --help
          Print help (see a summary with '-h')

  -V, --version
          Print version

Examples:

    $ mise install node@20.0.0       Install a specific node version
    $ mise install node@20           Install a version matching a prefix
    $ mise install node              Install the node version defined in config
    $ mise install                   Install all plugins/tools defined in config

    $ mise install cargo:ripgrep            Install something via cargo
    $ mise install npm:prettier             Install something via npm

    $ mise use node@20               Use node-20.x in current project
    $ mise use -g node@20            Use node-20.x as default
    $ mise use node@latest           Use latest node in current directory
    $ mise use -g node@system        Use system node everywhere unless overridden

    $ mise up --interactive          Show a menu to upgrade tools

    $ mise x -- npm install          `npm install` w/ config loaded into PATH
    $ mise x node@20 -- node app.js  `node app.js` w/ config + node-20.x on PATH

    $ mise set NODE_ENV=production   Set NODE_ENV=production in config

    $ mise run build                 Run `build` tasks
    $ mise watch build               Run `build` tasks repeatedly when files change

    $ mise settings                  Show settings in use
    $ mise settings set color 0      Disable color by modifying global config file
```

いくつかめぼしいコマンドだけピックアップしておきます。

```sh:sh
mise alias # エイリアスを管理する
mise doctor # mise の問題点を確認する
mise self-update # mise をアップデートする
mise upgrade # 古くなったツールのバージョンを上げる
```

# ちょっとした小技

## usage を入れておく

mise を利用する際にシェル補完機能に関するエラーが出ることがあります。これを回避するために mise の作者様が作った usage と呼ばれるツールを入れておきます。

```sh:sh
mise use -g usage
```

## 試験的機能を有効化する

上記のコマンド一覧の内、[experimental] 表示のされているものは試験的機能のため初期状態では無効化されています。以下のコマンドで有効化できます。

```sh:sh
mise settings set experimental true
```

## asdf 以外のバックエンドも使える（試験的機能）

コマンド一覧の Examples を見ると cargo や npm などのバックエンドも使えるようです。実際に走らせてみると以下のようになります。

```shell-session:sh
$ mise use -g npm:prettier
$ mise ls
Tool          Version  Config Source  Requested

...

npm:prettier  3.3.3

...
```

[公式サイトの該当ページ](https://mise.jdx.dev/dev-tools/backends/)を見ると、現在対応しているバックエンドには `asdf` 以外に `aqua`、`Cargo`、`Go`、`npm`、`pipx`、`SPM`、`Ubi`、`Vfox`があるようです。将来的には`brew`や`nix`などにも対応したいとのことです。
試しに`pipx`を用いて`xonsh` を入れてみます。

```sh:sh
mise use -g pipx # ここではコミュニティプラグインを用いてインストールしましたが、もちろん他の方法で pipx を導入しても構いません。
mise use -g pipx:xonsh
```

出力は省略しますが、これで実際に動作しました。

追記：`pipx` の代わりに `uvx` をバックエンドとして利用することもできるようです。最近 `uv` を使い始めたので個人的にはこっちを使っていきたいところ。以下のコマンドで導入できます。この場合 `pipx` はアンインストールしてしまっても構いません。

```sh:sh
mise use -g uv # uv 導入済みの場合は不要
mise settings set pipx_uvx true
```

# おわりに

もともと私が rtx の解説記事を書き始めたのはまだ新しいツールだったため解説記事もロクになく、自分で公式ドキュメントに当たりながら試行錯誤する必要があったため、だったらその備忘録を記事に起こして公開してしまえという気持ちからでした。あれから rtx 改め mise のユーザーも増え、解説記事も調べればいくらでも出てくる状況になりました。そんな中で私が今更追加で記事を書く必要があるのかなとも思いましたが、いつまでも `rtx asdf` で検索したときにそれなりに上に上がってくるような記事が古いままでは個人的に収まりが悪かったので重い腰を上げてこの記事を書くことにしました。とはいえバージョン管理機能以外のところに関してはほとんど手つかずなので、そのあたりも今後は触ってみようかなと思います。この記事が今後新規に mise を使い始める方の助けになれば幸いです。

# 参考文献

-   skyblue-jpn. 2023. “初心者の初心者による初心者のためのバージョン管理ツール Rtx 入門.” Qiita. Qiita. February 16, 2023. <https://qiita.com/skyblue-jpn/items/44f762252ff80f9e4fc1>.
-   Dickey, Jeff. 2024. “Home | Mise-En-Place.” Jdx.dev. 2024. <https://mise.jdx.dev/>.
-   jdx. 2024. “Jdx/Mise: Dev Tools, Env Vars, Task Runner.” GitHub. September 10, 2024. <https://github.com/jdx/mise>.
-   Dickey, Jeff. 2024. “Usage.” Jdx.dev. 2024. <https://usage.jdx.dev/>.

‌
‌