🌟

言語・ツールのバージョン管理、環境変数の管理、タスクランナーとしてまで使えるmiseというツールについて

2024/12/12に公開

表題のとおり、miseというツールがあります。
miseについての紹介記事もだいぶ増えてきましたが、まだ積極的に使っている人をあんまり見ないので、その有用性をお伝えするために、何番煎じとなってしまってもよいので書くことにしました。
※この記事は2024/12/12 00:00:00時点の情報、つまりv2024.12.5バージョンを元にしています。(この直後にv2024.12.6がリリースされました…)

miseとは

公式
mise

miseはざっくりいうとRust製のasdf Alternativeにあたるツールです。
asdfはいろんな言語や関連ツールのバージョン管理を統合的に行えるツールです。
実際、asdfのプラグインとして対応していたツールもmiseでインストールできます。
asdfのほうを使ったことがないので間違っていたら申し訳ないのですが、asdfは言語のバージョン管理に特化しているのに対して、miseは言語だけでなく、ツールや環境変数の管理、タスクランナーとしても使えるというのが特徴です。

miseのGitHubリポジトリのREADMEには以下のように書かれています。

Like asdf (or nvm or pyenv but for any language) it manages dev tools like node, python, cmake, terraform, and hundreds more.
Like direnv it manages environment variables for different project directories.
Like make it manages tasks used to build and test projects.

asdfは主にShellで書かれていますが、前述の通りmiseはRustで書かれています。
それによりWin、Mac、Linuxとあまり環境のことを考えずに使えるのが良いところですね。

miseはかつてrtxという名前で、たいへん検索性が低かったです。
miseという名前もそんなに検索性が高いかと言われると難しいですが。

Pronounced "MEEZ ahn plahs"

と公式にある通り、miseは「ミーズ」と読みます。
フランス語ですね。英語だと思っちゃうとなかなか読みづらいです。
mise-en-placeという言葉はフランス語で料理の下準備とか下ごしらえのことを表します。

以後、まずはmiseの簡単な使い方の説明から始めます。
また、miseはドキュメントでもDev Tools、Environments、Tasksと3つに分かれているのでそれぞれについて書いていきます。

miseの導入方法

公式のGetting Startedを参照しましょう。
丸写しになってしまうと良くないので細かくは上記ページを見てほしいのですが、とりあえずGetting Startedではcurlでインストールしています

curl https://mise.run | sh

他にもInstalling Miseに、Homebrew、dnf、apt、cargoなど(他にもたくさんあります)でのインストール方法が書かれています。
個人的にはbrewでインストールしています。
Shellもいろんなものにツール自体で対応しており、bash,zshだけでなくfish,xonsh,elvish,nushellにも対応しています(Completionは残念ながらbash,zsh,fishのみが公式に対応しているもののようです)。
今後増える可能性もありますし、増やしてほしいならIssueやPRを送るとよいでしょう。

IDEと組み合わせて使う場合のこともドキュメントに書いてあるので詳しくはそちらを御覧ください。
IDE Integration

英語にはなってしまいますが、ドキュメントの情報量がそこそこ充実しているのもmiseの良いところです。

設定ファイル

miseは過去の類似ツール(.*envといった名前のツール)で使われていた.*-versionのようなファイルや、asdfの.tool-versionsとの互換性もあり、それらを使って言語やツールのバージョンを管理することもできます。
しかし、mise自体にはmise.tomlというファイルを扱ってバージョンを扱う機能があるので、新しくmiseを使う場合はそちらを使うことをお勧めします。

※asdfとの違いについては公式にComparison to asdfというページがあるのでそちらを参照してみてください。

mise.tomlとその設定内容についてはこちらのページに詳しく書いてあります。

mise.tomlと書いていますが、実際には下記のようにさまざまなファイルを認識できます。

mise.toml is the config file for mise. They can be at any of the following file paths (in order of precedence, top overrides configuration of lower paths):
mise.local.toml - used for local config, this should not be committed to source control
mise.toml
mise/config.toml
.config/mise.toml - use this in order to group config files into a common directory
.config/mise/config.toml
.config/mise/conf.d/*.toml - all files in this directory will be loaded in alphabetical order

※書いてないですが、.mise.tomlも認識されるようです。

mise cfgコマンドで現在miseが認識しているファイルを確認できます。
グローバルな設定は通常.config/mise/config.tomlに書くことが多いです。
プロジェクトに個別にmise.tomlを配置もできますし、mise.local.tomlを使って個人の環境に合わせた設定もできます。
また、ディレクトリごとにmise.tomlを配置することもできます。

各言語やツールのバージョンの設定はもちろん、環境変数やタスクランナーの設定もこのmise.tomlにまとめて記述します。
だからこそ、miseの設定はちゃんとmise.tomlの形式で書くことを推奨します。

Dev Tools、Environments、Tasksの設定については後述します。

設定可能なすべての項目はSettingsを参照してください。
自分も正直まだ全然把握しきれていません…。

新しくmise.tomlやそれに類するファイルを作った時はmise trustコマンドでmiseに認識させる必要があるのでその点はご注意ください。
認識させてない状態で動かそうとするとメッセージが出るはずです。

Dev Tools

※ここに書いてあることはDev Toolsにも書いてあるので、一次情報としてはそちらを参照してください。

Dev Toolsとしての機能では、言語のツールやバージョンの管理を行います。
個人的にはこれがmiseのメインの機能だと思っています。
asdfを使っていた人にはイメージしやすいでしょう。

バージョンはmise.tomlに記述します。

参考までに、自分のMacの.config/mise/config.tomlを載せておきます。
※ややバージョンが古いのは気にしないでください…。

[tools]
node = "20.10.0"
terraform = "1.9.7"
terraform-docs = "0.17.0"
python = "3.11.6"

mise.tomlにあらかじめこのように書いておいてmise installをすることで、mise.tomlに書かれたバージョンの各ツールがインストールされます。

また、mise install node@20.0.0のように特定バージョンを指定してインストールもできます。
mise install node@20だと最新の20系がインストールされます。
mise install nodeのようにバージョン指定をしなければmise.tomlに書かれたバージョンがインストールされます。
こうしてツールをインストールしたうえでmise useコマンドで実際に使用するバージョンを指定します。
mise use node@20.0.0のように指定すると、現在参照しているmise.tomlにここで指定したバージョンが記載されます。
mise execまたはmise xで、miseでインストールした言語やツールのバージョンを指定したうえでコマンド実行することもできます。

重ねてになりますが、詳しくはDev Toolsをご参照ください。

Environments

※より詳しいことはEnvironmentsをご参照ください。

miseでは環境変数を管理することもできます。
これの何がうれしいかというと、前述の通りmise.tomlはいろんなディレクトリに配置できるので、そのディレクトリ事に環境変数を設定できます。
これは従来direnvを使って行っていたことですが、その役割をmiseが担うことができます。
※ちなみに、miseとdirenvは併用できます。こちらのドキュメントを参照。個人的には混乱の元なのでどちらか(可能であればmise側)に寄せることをお勧めします。

自分がよく使うのは、AWS_PROFILEの切替ですね。

[env]
AWS_PROFILE = "foo"
AWS_SDK_LOAD_CONFIG = 1

少し話が逸れるのですが、AWS_PROFILEを環境変数に設定しておくと、~/.aws/configに定義してあるprofileを使用できます。
これにより、ディレクトリごとに使うprofileを切り替えてTerraformの実行先を切り替えるというのを自分はよくやります。
これを今までdirenvでやっていたのですが、今はmiseを使うようにしています。

もちろん、Dev Toolsで記載していた言語やツールのバージョン設定も一緒に記述できるので、バージョン管理と環境変数をまとめられます。

その他の使い方はEnvironmentsを参照してください。

Tasks

自分は最近まで知らなかったのですが、miseはタスクランナーとしても使えます。
あんまりよく知らなかったので自分も使い方を知るつもりで記述します。

たとえば、mise.tomlに以下のように記述します。

[tasks.build]
description = "Build the CLI"
run = "cargo build"

こうするとmise run buildcargo buildが実行されます。
miseの他のコマンドと被らなければmise buildのようにrunを省略しても実行できるようになったそうですが、混乱の元になりそうなので毎回mise runにしたほうが良さそうです。
自分はローカルで以下のように試してみました。

[tasks.sl]
description = "Run SL"
run = "sl"

これによりmise run slまたはmise slでSLが走ることを確認しました。

なお、実行可能なTaskはmise tasksで確認できます。
他にもタスクをグループ化する、ファイルを監視して変化した時にタスクを実行するなど高度な使い方もあるそうですので、詳細はRunning Tasksを参照してください。
タスクは別ファイルに切り出すこともできるそうで、そのへんの使い方はFile Tasksに詳しく書いてあります。

個人的にもあまりまだ使えてないので今後活用したいなと思っています。

※参考
かなり詳細に書いているので「どう書いたらいいんだっけ」みたいなのはだいたい解決すると思います
Tasks
Running Tasks
TOML-based Tasks
File Tasks

注意点

miseはさまざまな言語やツールを統合的に管理できますが、そのぶん各言語内で管理を完結させようとするツールとの相性が悪めです。
個人的には特に相性が悪いと感じたのはVoltaでしょうか。
Voltaは言語のバージョンもpackege.jsonで管理しようとするため、ツールの責任範囲がバッティングしてしまいます。
JSのバージョン管理だけVoltaでやって、他のツールの管理だけmiseでやる、というのはちょっと面倒です。
自分自身がJSのエコシステムに慣れていないのもあるのですが、このへんをうまく解決できませんでした。
うまく使い分けているよという方はぜひコメントで教えてください。
他にも、言語やツールのバージョン管理の責任範囲がバッティングするケースがあるはずですので、何をどのように管理しているかには注意を配りましょう(最近だとuvでPythonを管理するケースなど?)。

まとめ

今回はmiseというすばらしいツールの紹介をしました。
言語やツールのバージョン管理は今までにもさまなツールがあり、言語やツールごとに乱立していましたが、miseはasdfと同様にそれらを統合的に管理できるツールです。
それに加えて、環境変数の管理やタスクランナーとして使えるのはこのあたりを管理する人にとっては非常に助かるのではないでしょうか。
みなさんがこの記事を見ることでmiseを知って、言語やツールのバージョン管理に対する悩みが解消されてくれることを願っています。

脚注
  1. みすてむず いず みすきーしすてむず とは、オープンソースのプラットフォームMisskeyのインスタンスのひとつで、主にITに関わる人が参加しています。最近はXよりもそちらに入り浸っています。 ↩︎

GitHubで編集を提案

Discussion