miseのすすめ
はじめに
皆さんはバージョン管理ツール何を使っていますか?私は「mise」をおすすめします。
複数の言語やツールを扱うために様々なバージョン管理ツールを駆使していて、この煩雑な管理方法をもっとスマートにできないものかという不満を「mise」が解決してくれました。
基本的な使い方
インストール
macOSであればHomebrewでインストールします
brew install mise
他のプラットフォームについては、公式ドキュメントを参照してください。
基本の使い方
# 言語のバージョンリストを確認
mise ls-remote node
# 言語のバージョンを指定してインストール
mise install node@24.0.1
mise install node@22.15.0
# 現在のディレクトリではver22.15.0を使う
mise use node@22.15.0
# グローバルではver24.0.1を使う
mise global node@24.0.1
これで現在のディレクトリとそうでないディレクトリで異なるnodeを使う環境が簡単に構築できました。
プロジェクト設定ファイル
mise use ツール@バージョン
を行うとそのディレクトリの.mise.toml
にバージョンが定義されます。
なので直接ファイルを作成して記述することでプロジェクトの環境を定義させることも可能です。
[tools]
python = "3.13.3"
uv = "0.7.3"
この設定により、プロジェクトディレクトリに入ると自動的に指定されたバージョンが有効になります。
モノレポ構成
フロントエンドにNode、バックエンドにPython、を使うようなモノレポ構成なプロジェクトでも、それぞれのバージョンを1つの設定ファイルで管理できます。
[tools]
node = "22.15.0"
python = "3.13.3"
uv = "0.7.3"
asdfとの互換
asdfとの互換があり.tool-versions
そのまま利用できるのも嬉しい点の1つです。
もちろんasdfからmiseの設定ファイルへ移行することも可能です。
mv ~/.tool-versions ~/.tool-versions.bak
# ツール@バージョンの形式に置き換えてmiseにインストールさせる
cat ~/.tool-versions.bak | tr ' ' '@' | xargs -n2 mise use -g
miseの高度な機能
1. 環境変数管理
私が導入しようとしたきっかけはこれで、miseは環境変数の管理も簡単に行えます。
.mise.toml
ファイルに[env]
セクションを追加するだけで、プロジェクトごとに環境変数を定義できます
[env]
NODE_ENV = "production"
DATABASE_URL = "mysql+pymysql://test_user:password@localhost:3306/test_db"
# config_rootで設定ファイルのパスが取得できます
PYTHON_PATH = "{{config_root}}/backend",
個人的には、チームで共有にしたい情報はmise.tomlで指定してコミットに含める、センシティブな情報は別にmise.local.tomlで手元で管理するのがおすすめです
またコマンドから設定することも可能です
mise set NODE_ENV="development"
echo $NODE_ENV
# development
また、.env
ファイルを指定することも可能です
[env]
_.file = [".env", ".env.local"]
2. タスクランナー機能
miseには組み込みのタスクランナー機能もあり、プロジェクト固有のコマンドを定義・実行できます
[tasks.build]
run = "npm run build"
[tasks.start]
# buildの実行後にstartさせられる
depends = ['build']
run = "npm run start"
[tasks.lint]
run = [
"uv run ruff check .",
"uv run mypy ."
]
これにより、mise run start
のように簡潔なコマンドでタスクを実行させることが可能です。
まとめ
miseは、複数の言語やツールを扱う開発環境において、バージョン管理の煩わしさを大幅に軽減してくれるツールです。
miseで、「このプロジェクトには何のバージョンが必要だっけ?」みたいな疑問を持つ必要もなく導入もごく僅かな手間で済むため、開発効率もかなり上がるかと思います。
ぜひ試してみてください!
参考資料
Discussion