開発ツールのバージョン管理、mise
概要
- 一つの開発言語だけでなく、さまざまな開発言語を使っていますか?
- sdkman、rvm、nvmなどの複数のパッケージマネージャーのコマンドを覚えるのに疲れたことはありませんか?
- 開発環境をもっと速く、便利に管理したくありませんか?
miseを使えば、どの言語やツールを使っても正確に必要なバージョンを使用でき、他のバージョンに切り替えたり、プロジェクトごとにバージョンを指定することも可能です。ファイルで明示するため、チームメンバー間でどのバージョンを使うか議論するなどのコミュニケーションコストも減らせます。
これまでこの分野で最も有名だったのはasdfでした1。しかし、最近miseを使い始めてからは、miseの方がUXの面で少し優れていると感じています。今回は簡単な使用例を紹介しようと思います。
意図的かどうかは分かりませんが、ウェブページさえも似ています。
mise-en-place、mise
mise
(「ミーズ」と発音するようです)は開発環境設定ツールです。この名前はフランス料理の用語に由来し、大まかに「設定」または「所定の位置に置く」と訳されます。料理を始める前にすべての道具と材料が所定の位置に準備されている必要があるという意味だそうです。
簡単な特徴を列挙すると以下の通りです。
- ほとんどの開発言語およびツールをサポートするパッケージマネージャー
- プラグイン形式で追加可能
- Shellで書かれたasdfとは異なり、Rustで書かれている
- asdfの機能に加えて、direnvのように環境変数を設定する機能も提供
インストール
インストールはbrewを通じて行えます。
brew install mise
# または
curl https://mise.run | sh
mise --version
# mise 2024.6.6
miseの有効化
ガイドに従って有効化コマンドを実行します。
# bash
echo 'eval "$(~/.local/bin/mise activate bash)"' >> ~/.bashrc
# zsh
echo 'eval "$(~/.local/bin/mise activate zsh)"' >> ~/.zshrc
使用例
依存バージョン管理
新しい環境に就職または転職して新しい機器を受け取ったと仮定しましょう。新しい場所ではJavaを基本的に使用しているので、必要なバージョンをインストールできるか確認します。
mise ls-remote java
バージョンが多すぎて困惑する場合はmise ls-remote java | fzf
を使ってみてください
corretto-11.0.18.10.1
をインストールし、基本的なJavaバージョンとして設定しました。
mise use --global java@corretto-11.0.18.10.1
記事執筆時点でのJavaのLTSは21です。21をインストールし、よく使っている17も一緒にインストールしてみましょう。
mise install java@17 java@21
インストールが完了した後、mise ls
コマンドを使うとどの言語がインストールされているか確認できます。
mise ls
ちょうどチームリーダーが新しいプロジェクトはJava 21でやってみようと言っています。まずそのプロジェクトだけでJava 21を使用してみると良さそうです。
mkdir project && cd project
touch .mise.toml
mise use java@21
miseを使用する際は、.mise.toml
というファイルを使ってどのバージョンを使用するか明示します2。
# ~/project/.mise.toml
[tools]
java = "21"
再度mise ls
を実行すると、Config Source
の変更とともに適用中のJavaバージョンが変更されたことを確認できます。
これまでasdfを使っていて.tool-versions
ファイルが既にある場合は、tool-versions
をそのまま使用することもできます。
これでプロジェクトごとに異なるJavaバージョンを使用できるようになりました3。どのJavaバージョンを使用するかは.mise.toml
ファイルに明示されているので、チームメンバー間での開発環境の違いによる問題も最小限に抑えられそうです。
考えてみると、Java 11はもう不要かもしれません。17をデフォルトとして使い、11は削除します。
mise use --global java@17
mise uninstall java@corretto-11.0.18.10.1
さて、業務で使用する言語のインストールは終わったので、個人的によく使う言語をもう少しインストールしましょう。
私はObsidianのプラグインであるO2をTypeScriptで開発しています。nodeの最新安定版をインストールします。
mise use node@lts
Pythonを使ったデータクレンジング作業も時々あります。
mise use python@3.12.3 # Pythonはバージョンに敏感なので、できるだけ具体的なバージョンを使用しています。
業務用メッセンジャーボットをgolangで作ったり、トラフィック実験に使うAPIもgolangで作っています。
mise use go@latest
Rust、Rubyなどもたまに使いますが省略...
ああ、なんだかたくさんありますね。一度にインストールできるといいですね。
~/.config/mise/config.toml
に明示しておき
# ~/.config/mise/config.toml
[tools]
java = "corretto-11.0.18.10.1"
node = "lts"
go = "latest"
python = "3.12.3"
mise install
を使うと必要な依存関係を一度にインストールできます。
mise install
もちろん、単にコマンドで一度に処理しても構いません。~/.config/mise/config.toml
に明示されていない言語は自動的に追加されます。
mise use --global node@lts python@3.12.3 go@latest
私は通常、開発言語だけを管理していますが、gradleやawscliなどの他のツールもmiseを通じてバージョン管理が可能です。
環境変数管理
mise = asdf + direnv
miseを使うと、異なるプロジェクトごとに異なる個別の環境変数も指定できます。direnvで得られるユーザー体験と完全に同じです。いや、むしろ.envrc
ファイルを管理しなくても済むので、より便利に感じます。
.mise.toml
に簡単な変数を一つ定義してみましょう。
[env]
HELLO = 'WORLD'
.mise.toml
に定義した環境変数が適用されるには、mise trust
というコマンドを通じて確認する必要があります。これは他のプロジェクトファイルをダウンロードして自動的に実行されることでセキュリティ問題が発生するのを防ぐためです。
echo
で出力してみると、環境変数が正常に動作していることを確認できます。
~/project/.mise.toml
に設定された情報は~/project
ディレクトリ内でのみ有効なので、このスコープを外れるとHELLO環境変数も自動的に解除されます。
.mise.toml
を直接編集せずに、CLIを通じて管理することもできます。
mise set HELLO=world
mise set HELLO
# world
mise set
# key value source
# HELLO WORLD ~/project/.mise.toml
mise unset HELLO
mise set
# key value source
簡単ですね?globalで環境変数を管理する必要がある場合は、前述の通り~/.config/mise/config.toml
に定義しておけば良いです。
mise set -g GLOBAL='mise is insane!'
mise set
# key value source
# GLOBAL mise is insane! ~/.config/mise/config.toml
特定の開発環境に必要な情報をすべて.mise.toml
にまとめて共有すれば、はるかに簡単に環境設定を終えることができます。前述の通り、miseではパッケージバージョンも管理できるので、asdf
もall-in-oneに近い非常に優れたツールでしたが、環境変数まで管理できる点はmiseをさらに特別なものにしています。
結論
このようにして大まかな開発環境の構成が終わりました。言語をインストールしただけで何が終わりだって?他の部分はdotfile管理を参考にしてください。皆さん、新しい機器を受け取って開発環境を構成するのに1〜2時間かかると思うので、残りの時間は開発書籍でも読もうと思います。