miseを使ったら開発環境のバージョン管理が快適になった

## はじめに

私は普段、KotlinやJavaの開発をしていますが、プロジェクトによって、あるいはトラブルシューティングなどのため、実行環境のJavaバージョンを変えたくなるときがあります。
そんな時は`JAVA_HOME`を変更する方法もあるでしょうし、`SDKMAN!`のようなツールを使う方もいるでしょう。
こういう問題は、Javaに限らず色んな言語・実行環境・ツールで発生します。

私は最近`mise`（ミーズ）というツールを使い始めたのですが、便利にバージョン管理できていますよというお話です。

:::note
この記事は「`mise`を個人でサクッと使う」（ローカルの開発環境を切り替える）ことに的を絞っています。

チームでプロジェクトごとの開発環境を共有する話や、`mise`そのものの詳細などは別の記事にする予定です。

`mise.toml`も出てきません。
:::

**2025/03/26 追記**

-> `mise`そのものの話や、`mise.toml`についての別記事を書きました

https://qiita.com/fujithuro/items/f2902323f7d6d28b9124


### 環境

この記事を書いている環境は以下の通りです。

OS: macOS Sequoia 15.3.1
ターミナル: warp v0.2025.02.12.16.51.stable_03

mise:  2025.2.8 macos-arm64 (2025-02-25)


## 何が良いの？（どう使うの？）

まず「何が良いのか」をお伝えします。
簡単に言えば、**コマンド1つで開発環境を切り替えられる**のが楽で良いです。
実際に使い方を見てみます。


### `mise ls`でツール一覧確認

まず`mise ls`（ないし`mise list`）で、利用可能なツールの一覧を確認できます。

```sh:sh
$ mise ls
```

![スクリーンショット 2025-03-05 22.35.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760224/cf6b556c-8dfd-4d60-81c6-36aa31f41d2a.png)

出力を画像で貼っているのは、バージョンによって色が違うのを見てもらいたいからです。
現在使われているものとそうでないものは、色が違って表示されます。

この環境では、`Java`でいうと`17`, `19`, `21`が入っていて、現在は`21`が使われているのが確認できました。


### `mise use`でバージョン変更

ツールのバージョンを変えたい場合は、以下のように`mise use`を使います。
ためしに`Java`を`17`に切り替えましょう。

```sh:sh
$ mise use java@openjdk-17.0.2
```

これだけです！
あっさりと、使用する環境を変更できました。

`mise ls`で確認しましょう。

![スクリーンショット 2025-03-05 22.44.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760224/88b537e8-eb40-496e-b12d-0cf35b2281db.png)

ちゃんと`17`になっていますね！


一応、Javaのコマンドでもバージョンを確認してみましょう。

```sh
$ java -version
openjdk version "17.0.2" 2022-01-18
OpenJDK Runtime Environment (build 17.0.2+8-86)
OpenJDK 64-Bit Server VM (build 17.0.2+8-86, mixed mode, sharing)
```

ちゃんと`Java`の`17`が使われていることが確認できました！

:::note
`mise use`を使う際、オプションなしだとカレントディレクトリ以下の環境が変更されます。
グローバルに（端末全体に）変更を反映したい場合、下記のように`-g`オプションを付与してください。

```sh:sh
$ mise use -g java@openjdk-17.0.2
```

:::


## 導入

### インストール

「何ができるのか」「どう便利なのか」の話が終わったところで、インストール方法を説明します。
と言っても、↓の公式ドキュメントに書いてあるとおりです。OSごとの導入方法や、Homebrewを使う場合など説明があるので、ご自分の環境に応じたコマンドを確認してください。

https://mise.jdx.dev/getting-started.html

一例として、ここではhomebrew経由でインストールします。

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

インストールできたことを確認するため、バージョンを見てみましょう。

```sh:sh
$ mise --version
              _                                        __              
   ____ ___  (_)_______        ___  ____        ____  / /___ _________
  / __ `__ \/ / ___/ _ \______/ _ \/ __ \______/ __ \/ / __ `/ ___/ _ \
 / / / / / / (__  )  __/_____/  __/ / / /_____/ /_/ / / /_/ / /__/  __/
/_/ /_/ /_/_/____/\___/      \___/_/ /_/     / .___/_/\__,_/\___/\___/
                                            /_/
2025.2.8 macos-arm64 (2025-02-25)
```

ロゴの主張が激しいですが、ちゃんと出てますね。


### アクティベート

#### アクティベートとは

インストールできたら次はアクティベートの設定をします。

この記事では細かい話は省きますが、アクティベートすると常に最適な環境変数や`PATH`が使われるので便利になります。


#### アクティベート方法

アクティベートの方法も、↓の公式ドキュメントに書いてある通りです。OSや、使っているシェルごとにアクティベート用のコマンドが用意されているので実行してください。

https://mise.jdx.dev/getting-started.html#activate-mise

一例として、`zsh`を使っている場合は↓ですね。

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

要は`.zshrc`に`eval "$(mise activate zsh)"`を加えています。
シェルの設定を書き換えた後は、設定を読み込み直しましょう

```sh:sh
$ source ~/.zshrc
```

ここまで出来たら、`mise doctor`（ないし`mise dr`）で問題ないことを確認しましょう。

```sh:sh
$ mise dr
version: 2025.2.8 macos-arm64 (2025-02-25)
activated: yes
shims_on_path: no

(中略)

No problems found
```

出力が長いので省略しましたが、`activated: yes`、`No problems found`となっていれば準備完了です！


## 使う

### ツールのインストール

インストールとアクティベートが済んだだけでは、まだ何もツールがありません。
ためしに`mise ls`をやってみても何も出てこないと思います。

```sh:sh
$ mise ls
Tool  Version  Source  Requested 
```

というわけで、さっそく管理したいツールをインストールしましょう。
インストールする時は、下記のコマンドを実行します。

```sh:sh
$ mise install <ツール名>@<バージョン>
```

ちなみにバージョンを省略すると、最新の安定版がインストールされます。

私は今回、JavaのOpenJDK 21を入れたいので、下記のように実行します。

```sh:sh
$ mise install java@openjdk-21.0.2
```

成功すれば、下記のように`mise ls`の結果に出てくるようになります。

```
$ mise ls
Tool  Version         Source  Requested 
java  openjdk-21.0.2
```

### 使えるバージョンのチェック

ちなみに、ツールの使えるバージョン等を確認したい時は、`mise ls-remote`が使えます。

```sh:sh
$ mise ls-remote <ツール>
```

Javaで試すとこんな感じですね。
Javaはバージョンと言うかディストリビューションが多すぎて大量に出力されるので、略しまくってますが、色々扱えるよという雰囲気は感じてもらえるのではないでしょうか。

```sh:sh
$ mise ls-remote java
adoptopenjdk-jre-11.0.15+10
adoptopenjdk-jre-11.0.16+101
adoptopenjdk-jre-11.0.16+8
(中略)
corretto-17.0.11.9.1
corretto-17.0.12.7.1
corretto-17.0.13.11.1
corretto-17.0.14.7.1
(中略)
graalvm-community-21.0.0
graalvm-community-21.0.1
graalvm-community-21.0.2
(中略)
mandrel-23.1.3.1-Final+java21
mandrel-23.1.4.0-Final+java21
mandrel-23.1.5.0-Final+java21
mandrel-23.1.6.0-Final+java21
(中略)
openjdk-19.0.0
openjdk-19.0.1
openjdk-19.0.2
(中略)
temurin-jre-21.0.3+9.0.LTS
temurin-jre-21.0.4+7.0.LTS
temurin-jre-21.0.5+11.0.LTS
temurin-jre-21.0.6+7.0.LTS
(後略)
```

### 使うツールの指定

後は記事の冒頭で説明したのと同じですが、`mise use`で使うツールを指定するだけです。

```sh:sh
$ mise use <ツール>@<バージョン>
```

さっき入れたJavaのOpenJDK 21を使いたい場合はこうですね。

```sh:sh
$ mise use java@openjdk-21.0.2
```

`mise ls`を実行すると、`use`で指定したツールの色が変わって、使わないものはグレーになっていますね。


![スクリーンショット 2025-03-05 22.35.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760224/236991d8-fd2e-4a8a-9ea3-8b7a41322170.png)


### インストールされていないものを`mise use`

ちなみに、`mise use`は使うツールの切り替えに使うと説明してきましたが、未インストールのツールを`mise use`で指定すると、そのツールをインストールした上で、それを使うように切り替えます。

試しにまだ入っていない`Java`の`23`を入れてみましょうか。

```sh:sh
$ mise use java@openjdk-23.0.2
mise To enable macOS integration, run the following commands:
sudo mkdir /Library/Java/JavaVirtualMachines/openjdk-23.0.2.jdk
sudo ln -s /Users/fujita/.local/share/mise/installs/java/openjdk-23.0.2/Contents /Library/Java/JavaVirtualMachines/openjdk-23.0.2.jdk/Contents

openjdk version "23.0.2" 2025-01-21
OpenJDK Runtime Environment (build 23.0.2+7-58)
OpenJDK 64-Bit Server VM (build 23.0.2+7-58, mixed mode, sharing)
mise java@openjdk-23.0.2 ✓ installed
mise ~/.config/mise/config.toml tools: java@openjdk-23.0.2
```

`use`の出力だけ見ても分かりにくいので、例によって`mise ls`を見てみると

![スクリーンショット 2025-03-05 23.07.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3760224/f9da4516-6996-4217-a13c-45b7d067449d.png)

ちゃんと`23`が使われていますね！