mise(ミーズ) | Rust製の開発環境のセットアップツールの導入

:::note info
この記事は[ミライトデザイン Advent Calendar 2024](https://qiita.com/advent-calendar/2024/miraito-inc)14日目の記事です。
13日目は[ブッチ](https://zenn.dev/t_kitamura)さんの「[【AI検索エンジン】Perplexityで学ぶ次世代での情報収集術](https://zenn.dev/t_kitamura/articles/3d0c337d08cc1a)」という記事でした。
:::

[Perplexity(パープレキシティ)](https://www.perplexity.ai) サービスは初めて知りました👀
今まで調べ物はググってましたが、これからはパプる時代かもしれません...！

## はじめに

プログラミング言語のバージョン管理で、複数ツールを使い分けるのに苦労していませんか？
miseはシンプルかつ効率的なバージョン管理を提供する、Rust製の開発環境のセットアップツールです。

## mise(ミーズ) とは

- Rust製で高速かつ軽量
- プログラミング言語や開発ツールの管理
- 環境変数の管理
  - [dotenv](https://github.com/motdotla/dotenv) を利用できる
- タスクランナー
  - [Taskfile](https://taskfile.dev) のようなタスクランナーをこなす
  - ファイルの変更も検知可能

miseはRustで開発されたプログラミング言語のバージョン管理ツールです。
発音は「Meez(ミーズ)」または「mise-en-place(ミーズアンプレース)」と読みます。
フランス語の料理用語で「セットアップ」、「所定の場所に置く」という意味があるそうです。

以前は「rtx」と呼ばれていましたが、NVIDIA RTXグラボと名前が被るため変更されたとのことです。
類似のツールとしては[anyenv](https://github.com/anyenv/anyenv)や[asdf](https://asdf-vm.com)や[anyenv](https://anyenv.github.io)があります。

他ツールの設定ファイルの互換性があるので、導入はスムーズです！

## インストール

次のコマンドでインストールできます。

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

Homebrewからインストールもできます。
(わたしはHomebrewからインストールしてます)

```shell
$ brew install mise
$ mise --version
2024.12.9 macos-arm64 (2024-12-14)
```

## プログラミング言語や開発ツールの管理

### 設定ファイル

`.mise.toml` ファイルを管理したいプロジェクトディレクトリへ配置します。
(コマンドを実行すると生成されます)

既存プロジェクトに導入する場合は他ツールと共存させるため、asdfで使用される `.tool-versions` ファイルもサポートしたり他にも `.node-version` や `.ruby-version` など個別のレガシーファイルにも対応しています。

新規プロジェクトであれば `.mise.toml` を配置すれば良いです。

```toml:.mise.toml
[tools]
node = "22.12.0"
```

詳しくは公式の設定ファイルの項目を参照ください。

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

### 基本的な使い方（コマンド例＋出力例）

#### インストール可能なプラグイン一覧を表示する

```
$ mise plugins ls-remote
```

https://mise.jdx.dev/plugins.html#core-plugins

#### インストール可能なNodeのバージョン一覧を表示する

```shell-session
$ mise ls-remote node
...
21.7.1
21.7.2
21.7.3
...
22.10.0
22.11.0
22.12.0
...
23.2.0
23.3.0
23.4.0
```

```shell-session
$ mise ls-remote bun
...
0.7.3
0.8.0
0.8.1
...
1.0.34
1.0.35
1.0.36
...
1.1.36
1.1.37
1.1.38
```

#### Node v23 の最新をインストールする

```shell-session
$ mise use node@23
```

#### Node v22.12.0 を指定してインストール

```shell-session
$ mise use node@22.12.0
```

インストールすると `.mise.toml` に追記されます。

```shell-session
$ cat .mise.toml 
[tools]
node = "22.12.0"
```

#### グローバル設定

`~/.config/mise/config.toml` とファイルを設置するとグローバル設定が行えます。

```toml:~/.config/mise/config.toml
[tools]
node = "23.4.0"
```

グローバル設定ファイルに書いた場合も `mise install` でインストールできます。

```shell-session
$ mise install
```

コマンドからインストールしたい場合は `-g` オプションを付けてるとグローバル設定ファイルに追記されます。

```shell-session
$ mise use node@23.3.0 -g
```

## 環境変数の管理

このように環境変数を設定できます。

```toml:.mise.toml
[env]
ENV_NAME = "develop"
```

```shell-session
$ echo $ENV_NAME
local
```

### dotenv

[direnv](https://github.com/direnv/direnv) に対応しています。

```toml:.mise.toml
[env]
mise.file = ".env"
```

```text:.env
ENV_NAME=develop
```

```shell-session
$ echo $ENV_NAME
local
```

## タスクランナー

```toml:.mise.toml
[tools]
bun = "latest"
pre-commit = "latest"

[tasks.setup]
description = "Setup project"
run = "mise install && pre-commit install && bun install"

[tasks.build]
description = "Build"
run = "ENV_NAME=production API_URL=https://example.com bun build"
```

`setup` と `build` のタスクを登録しています。

```shell-session
$ mise run setup
$ mise run build
```

タスクランナーは `mise run` で実行できます。
[bun](https://bun.sh)、[pre-commit](https://pre-commit.com) をサンプルで入れてます。

## 補足

### mise WARN  gpg not found, skipping verification

```shell-session
$ mise install
mise WARN  gpg not found, skipping verification
...
```

次のような警告が表示された場合は電子署名をチェックするコマンドがないだけなので、 [gnupg](https://gnupg.org) をインストールしてください。

```shell-session
$ brew install gnupg2
```

<!--

### autoconf not found.

```autoconf not found.
$ mise use php@8.4
Extracting source code...
Running buildconfig...
buildconf: Checking installation
buildconf: autoconf not found.
           You need autoconf version 2.68 or newer installed
           to build PHP from Git.
mise ERROR failed to install asdf:php@8.4.1
mise ERROR ~/.local/share/mise/plugins/php/bin/install exited with non-zero status: exit code 1
mise ERROR Run with --verbose or MISE_VERBOSE=1 for more information
```

`autoconf` コマンドないエラーが出たのでインストールします。

```shell-session
$ brew install autoconf
```

```shell-session
$ mise use php@8.4
...
configure: error: bison 3.0.0 or later or newer is required to generate PHP parsers
configure: error: re2c 1.0.3 or newer is required to generate PHP lexers.
configure: error: The pkg-config script could not be found or is too old.  Make sure it
configure: error: GD library build test failed.
```

```shell-session
$ brew install bison re2c pkg-config gd libpng jpeg webp freetype
```

-->

## さいごに

15日目は [tkek321](https://qiita.com/tkek321) さんの記事です！
お楽しみに！