メインコンテンツにスキップ

開発ツールのバージョン管理、mise

· 11分の読み時間
Haril Song
Owner, Software Engineer at 42dot

概要

  • 一つの開発言語だけでなく、さまざまな開発言語を使っていますか?
  • sdkman、rvm、nvmなどの複数のパッケージマネージャーのコマンドを覚えるのに疲れたことはありませんか?
  • 開発環境をもっと速く、便利に管理したくありませんか?

miseを使えば、どの言語やツールを使っても正確に必要なバージョンを使用でき、他のバージョンに切り替えたり、プロジェクトごとにバージョンを指定することも可能です。ファイルで明示するため、チームメンバー間でどのバージョンを使うか議論するなどのコミュニケーションコストも減らせます。

これまでこの分野で最も有名だったのはasdfでした1。しかし、最近miseを使い始めてからは、miseの方がUXの面で少し優れていると感じています。今回は簡単な使用例を紹介しようと思います。

mise vs asdf

意図的かどうかは分かりませんが、ウェブページさえも似ています。

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 version list

fuzzy finder, fzf

バージョンが多すぎて困惑する場合はmise ls-remote java | fzfを使ってみてください

corretto-11.0.18.10.1をインストールし、基本的なJavaバージョンとして設定しました。

mise use --global java@corretto-11.0.18.10.1

languege select 1

languege select 2

記事執筆時点でのJavaのLTSは21です。21をインストールし、よく使っている17も一緒にインストールしてみましょう。

mise install java@17 java@21

mise install java

インストールが完了した後、mise lsコマンドを使うとどの言語がインストールされているか確認できます。

mise ls

mise list

ちょうどチームリーダーが新しいプロジェクトは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バージョンが変更されたことを確認できます。

mise list 2

check languege version

ヒント

これまで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

install all langueges

もちろん、単にコマンドで一度に処理しても構いません。~/.config/mise/config.tomlに明示されていない言語は自動的に追加されます。

mise use --global node@lts python@3.12.3 go@latest

install multi languege one command

install multi languege one command 2

ヒント

私は通常、開発言語だけを管理していますが、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時間かかると思うので、残りの時間は開発書籍でも読もうと思います。

image

参考文献


Footnotes

  1. 2024年6月時点でGitHub Star 21k

  2. mise configuration

  3. 例としてJavaを使用しただけで、JavaはIntelliJで設定するのが好ましいです。