開発環境の管理ツール mise ってなんだ？

## はじめに

先日、「miseを使ったら開発環境のバージョン管理が快適になった」という記事を書きました。

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


その途中で「そもそも`mise`って何？」という概要の節を挟もうと思っていたのですが、書いていたらそれなりのボリュームになって概要という感じでもなくなり、「使い方」という記事のテーマから脱線しそうだったので、別記事として書くことにしました。

こちらでは「そもそもmiseとは何なのか」を説明したうえで、設定ファイルである`mise.toml`や、チームでの環境統一についても扱います。
基本的な使い方やセットアップ方法が知りたい方は先述の記事をご参照ください。


## miseとは？

改めてですが、この記事では`mise`という「開発環境のセットアップやバージョン管理」のためのツールについて説明します。

公式ドキュメントが充実しているのですが、充実しすぎていると言うか、説明が詳しすぎる部分もあり、この記事を書いている時点では日本語化もされていないようなので、この記事でザックリと解説します。

https://mise.jdx.dev/


### 名前・発音

`mise`の発音は`ミーズ`です。公式でも`pronounced "meez"`とされています。
別名(?)として`mise-en-place`とも言います。名前の由来はフランスの料理用語で、ざっくり言うと「準備する」とか「整える」みたいな言葉のようです。

### 特徴・機能

繰り返しになりますが、`mise`は開発環境のセットアップツールです。

`asdf`などの後発にあたるツールですが、こちらはRust製で高速かつシンプルであり、`asdf`との互換もあるのが特徴です。

提供している機能は大きく下記の3つです。[先述の記事](https://qiita.com/fujithuro/items/b63a4aea09e1b277f689)で触れたのは、主に1つ目のインストール&バージョン管理の話になります。

* 開発ツール・ランタイムのインストール&バージョン管理
* 環境変数の管理
* タスクランナー


### アクティベート

[先述の記事](https://qiita.com/fujithuro/items/b63a4aea09e1b277f689)でも少し触れましたが、`mise`のインストール後にはアクティベートという作業を行うことになります。

アクティベートの設定を行うと、プロンプトが実行される度（つまり新しいシェルセッションを開いたり、`cd`でディレクトリを移動したりする度）に、毎回`mise activate`が働き、カレントディレクトリやプロジェクトに応じた環境変数や`PATH`を使ってくれるようになります。

CI/CDのような非対話的な場面では`shims`が推奨されるのですが、普通の（対話的なシェルを使う）開発環境ならアクティベートが推奨されています。

https://anatofuz.hatenablog.com/entry/2024/01/05/122649

アクティベートについてもっと詳しく知りたければ、公式のFAQにある"What does mise activate do?"も参照してください。

https://mise.jdx.dev/faq.html#what-does-mise-activate-do


### 管理できるツール

`mise`は多くの言語やツールに対応しています。まず公式で`Core Tools`として紹介されている組み込みプラグインは、記事執筆時点では以下の通り。

* Bun
* Deno
* Elixir (experimental)
* Erlang
* Go
* Java
* NodeJS
* Python
* Ruby
* Rust (experimental)
* Swift (experimental)
* Zig

詳細は公式ページを参照してください。

https://mise.jdx.dev/core-tools.html


#### プラグインについて

以前はプラグインを利用してツールを追加することも可能でしたが、現在はセキュリティの観点から非推奨になっています。`core tools`と`aqua`/`ubi`の仕組みがあるため、多くのツールはプラグインなしで動作します。

これも詳細は↓の公式ドキュメントを参照ください。

https://mise.jdx.dev/plugins.html

「で、プラグイン非推奨はわかったけど自分の使いたいあのツールは使えるの？」ということが知りたい場合には、↓の`registry.toml`を探して、

https://github.com/jdx/mise/blob/main/registry.toml

名前がありそうだったら、`mise ls-remote`で探してみるといいかもしれません。

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

## チームでの環境統一

個人で`mise`を利用するだけなら、`mise use`コマンドを使うだけで開発環境のバージョンを切り替えられます。しかし、チームでプロジェクトごとの開発環境を統一したい場合、`mise.toml`をチームで共有すると便利です。


### `mise.toml`とは

`mise.toml`は、要は`mise`の設定ファイルなのですが、プロジェクトごとの開発環境を定義することができます。このファイルがプロジェクトに含まれていることで、チーム内で同じツールやバージョンを使用するように統一できます。

例えば、`Node.js`と`Java`のバージョンを指定したかったらこういう感じですね。

```toml: mise.toml
[tools]
node = "18.16.1"
java = "openjdk-21.0.2"
```

ちなみに自分で作成しなくても、`mise use`コマンドを使うと、カレントディレクトリに無かったら自動で作成されます。
つまり、下記のコマンドを実行すると

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

下記のファイルが（カレントディレクトリに）生成されます。


```toml: mise.toml
[tools]
java = "openjdk-21.0.2"
```

作った覚えのない`mise.toml`がプロジェクト内にあったら、それは恐らく過去に実行した`mise use`で作成されたものでしょう。

なお、`mise.toml`の影響範囲はカレントディレクトリ以下ですので、通常は各プロジェクトの直下に配置します。


`mise.toml`をはじめとした設定ファイルについて、さらに詳しくは公式サイトをご確認ください。

https://mise.jdx.dev/configuration.html


### チーム開発での活用

`mise.toml`が配置された状態で`mise install`を実行すると、ファイルで指定されているバージョンのツールがインストールされます。

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

例えば、チームが開発しているプロジェクトやサービスが複数ある時に、それぞれで異なるバージョンの実行環境やフレームワークを使いたい、というケースがあると思います。
そんな場合、プロジェクトごとに`mise.toml`を用意しておけば（そして`mise`がアクティベートされていれば）、自動で指定のバージョンが使われるようになります。
自然とチーム全員が同じバージョンで動作させることができ、誤ったバージョンで動かしてしまって環境ハマリを起こすリスクも防げます。


## おわりに

「`mise`とは何か」という話と、`mise.toml`をチーム開発で活用することについて、簡単にまとめました。

`mise`はシンプルに使えますが、機能は他にも色々と用意されているようです。
また新しい情報に出会ったら整理して記事にしたいと思います。