mise(旧rtx)開発環境管理ガイド: asdfを超える次世代ツール
mise(旧rtx)は、複数のプログラミング言語のバージョン管理、タスクランナー、環境変数管理を1つのツールで実現する次世代の開発環境管理ツールです。
asdfの代替として登場し、高速性と使いやすさで注目されています。
miseとは
miseは、Rustで書かれた高速な開発環境管理ツールです。Node.js、Python、Ruby、Go、Java、PHP、Rustなど、数百のツールをサポートします。
特徴
- asdfより高速: Rustで書かれており、並列インストール可能
- 互換性:
.tool-versions(asdf)をそのまま読める - 統合管理: バージョン管理 + タスクランナー + 環境変数
- 直感的な設定: TOML形式の設定ファイル
- 豊富なプラグイン: 500以上のツールをサポート
インストール
# macOS/Linux
curl https://mise.run | sh
# Homebrew
brew install mise
# Cargo (Rust)
cargo install mise
# インストール確認
mise --version
シェル設定
# Bash
echo 'eval "$(mise activate bash)"' >> ~/.bashrc
# Zsh
echo 'eval "$(mise activate zsh)"' >> ~/.zshrc
# Fish
echo 'mise activate fish | source' >> ~/.config/fish/config.fish
# 設定を反映
exec $SHELL
基本的な使い方
ランタイムのインストール
# 利用可能なバージョンを確認
mise ls-remote node
# 最新版をインストール
mise install node@latest
# 特定バージョンをインストール
mise install node@20.11.0
mise install python@3.12.1
mise install go@1.21.5
# 複数のランタイムを一度にインストール
mise install node@20 python@3.12 go@1.21
グローバル設定
# グローバルバージョンを設定
mise use -g node@20
mise use -g python@3.12
mise use -g go@1.21
# 設定確認
mise ls
# ~/.config/mise/config.toml に保存される
cat ~/.config/mise/config.toml
プロジェクトごとの設定
# プロジェクトディレクトリに移動
cd ~/projects/my-app
# ローカルバージョンを設定
mise use node@20.11.0
mise use python@3.12.1
# .mise.toml が作成される
cat .mise.toml
# .mise.toml
[tools]
node = "20.11.0"
python = "3.12.1"
.tool-versions形式(asdf互換)
# .tool-versions ファイルでも管理可能
echo "node 20.11.0" >> .tool-versions
echo "python 3.12.1" >> .tool-versions
# 自動的にインストール
cd ~/projects/my-app # ディレクトリに入ると自動的に有効化
高度なバージョン管理
セマンティックバージョニング
# メジャーバージョンのみ指定(最新マイナー・パッチを使用)
mise use node@20
mise use python@3.12
# プレフィックスマッチ
mise use node@20.11 # 20.11.x の最新を使用
# ref: を使ってタグやブランチを指定
mise use node@ref:v20.11.0
複数バージョンの管理
# 複数バージョンをインストール
mise install node@18 node@20 node@21
# プロジェクトごとに切り替え
cd ~/project-a
mise use node@18
cd ~/project-b
mise use node@20
# 手動切り替え
mise shell node@21
node --version # v21.x.x
カスタムビルド
# ビルドオプションを指定
mise install python@3.12.1 --opts="--enable-optimizations"
# 環境変数でビルド設定
PYTHON_CONFIGURE_OPTS="--enable-optimizations" mise install python@3.12.1
タスクランナー機能
タスクの定義
# .mise.toml
[tools]
node = "20"
[tasks.dev]
run = "npm run dev"
description = "Start development server"
[tasks.build]
run = "npm run build"
description = "Build for production"
[tasks.test]
run = "npm test"
description = "Run tests"
[tasks.lint]
run = "npm run lint"
description = "Lint code"
[tasks.format]
run = "npm run format"
description = "Format code"
タスクの実行
# タスク一覧を表示
mise tasks
# タスクを実行
mise run dev
mise run build
mise run test
# 短縮形
mise run dev
# または
mise dev # タスク名が直接使える
依存関係のあるタスク
# .mise.toml
[tasks.clean]
run = "rm -rf dist"
[tasks.build]
depends = ["clean"]
run = "npm run build"
[tasks.deploy]
depends = ["build", "test"]
run = "./deploy.sh"
# deploy を実行すると自動的に build と test も実行される
mise run deploy
並列実行
# .mise.toml
[tasks.lint]
run = "npm run lint"
[tasks.typecheck]
run = "npm run typecheck"
[tasks.check]
depends = ["lint", "typecheck"]
# 依存タスクは並列実行される
環境変数付きタスク
# .mise.toml
[tasks.dev]
run = "npm run dev"
env = { NODE_ENV = "development", PORT = "3000" }
[tasks.prod]
run = "npm start"
env = { NODE_ENV = "production", PORT = "8080" }
環境変数管理
基本的な環境変数
# .mise.toml
[env]
NODE_ENV = "development"
DATABASE_URL = "postgresql://localhost/mydb"
API_KEY = "secret-key"
ファイルからの読み込み
# .mise.toml
[env]
_.file = ".env" # .env ファイルを読み込む
# .env
NODE_ENV=development
DATABASE_URL=postgresql://localhost/mydb
API_KEY=secret-key
テンプレート変数
# .mise.toml
[env]
PROJECT_ROOT = "{{ config_root }}"
DATA_DIR = "{{ config_root }}/data"
LOG_FILE = "{{ config_root }}/logs/app.log"
条件付き環境変数
# .mise.toml
[env]
NODE_ENV = "development"
[env.production]
NODE_ENV = "production"
API_URL = "https://api.example.com"
[env.staging]
NODE_ENV = "staging"
API_URL = "https://staging-api.example.com"
# 環境を切り替え
MISE_ENV=production mise run dev
MISE_ENV=staging mise run dev
プロジェクト構成例
フロントエンドプロジェクト
# .mise.toml
[tools]
node = "20.11.0"
pnpm = "8.15.0"
[tasks.install]
run = "pnpm install"
[tasks.dev]
run = "pnpm dev"
env = { PORT = "3000" }
[tasks.build]
run = "pnpm build"
[tasks.preview]
depends = ["build"]
run = "pnpm preview"
[tasks.lint]
run = "pnpm run lint"
[tasks.format]
run = "pnpm run format"
[tasks.typecheck]
run = "pnpm run typecheck"
[tasks.test]
run = "pnpm test"
[tasks.check]
depends = ["lint", "typecheck", "test"]
[env]
NODE_ENV = "development"
VITE_API_URL = "http://localhost:8080"
バックエンドプロジェクト
# .mise.toml
[tools]
node = "20.11.0"
go = "1.21.5"
postgres = "16"
[tasks.install]
run = "go mod download"
[tasks.dev]
run = "air" # ホットリロード
env = { PORT = "8080", ENV = "development" }
[tasks.build]
run = "go build -o bin/app cmd/main.go"
[tasks.test]
run = "go test ./..."
[tasks.migration]
run = "goose -dir migrations up"
[tasks.seed]
run = "go run cmd/seed/main.go"
[tasks.db-reset]
depends = ["migration", "seed"]
[env]
DATABASE_URL = "postgresql://localhost/mydb"
REDIS_URL = "redis://localhost:6379"
JWT_SECRET = "dev-secret"
モノレポ
# .mise.toml (ルート)
[tools]
node = "20"
pnpm = "8"
[tasks.install]
run = "pnpm install"
[tasks.dev]
run = "pnpm run dev"
[tasks.build]
run = "pnpm run build"
[tasks."dev:web"]
run = "pnpm --filter web dev"
[tasks."dev:api"]
run = "pnpm --filter api dev"
[tasks."build:all"]
run = "pnpm -r build"
[tasks.test]
run = "pnpm -r test"
[env]
PNPM_HOME = "{{ config_root }}/.pnpm"
asdfからの移行
既存の.tool-versionsを使用
# asdfの設定をそのまま読み込める
cat .tool-versions
# node 20.11.0
# python 3.12.1
# miseで自動的にインストール
cd ~/project
mise install # .tool-versions を読んでインストール
mise形式に移行
# .tool-versions を .mise.toml に変換
mise use node@20.11.0 python@3.12.1
# .mise.toml が作成される
cat .mise.toml
プラグインの確認
# asdfプラグイン一覧
asdf plugin list
# miseでサポート状況を確認
mise ls-remote <tool-name>
# ほとんどのasdfプラグインはmiseでも動作
プラグインとカスタムツール
利用可能なツール一覧
# すべてのツールを表示
mise registry
# インストール済みツール
mise ls
# 検索
mise registry | grep python
カスタムツールの定義
# .mise.toml
[tools]
"my-cli" = "1.0.0"
[plugins.my-cli]
uri = "https://github.com/username/mise-my-cli"
ベストプラクティス
グローバル vs ローカル
# ✅ Good: プロジェクトごとに明示的にバージョン指定
cd ~/project
mise use node@20.11.0
# ✅ Good: グローバルは安定版
mise use -g node@20
# ❌ Bad: グローバルで特定マイナーバージョン
mise use -g node@20.11.0 # 他のプロジェクトで困る
タスクの分割
# ✅ Good: 小さいタスクに分割
[tasks.lint:js]
run = "eslint ."
[tasks.lint:css]
run = "stylelint **/*.css"
[tasks.lint]
depends = ["lint:js", "lint:css"]
# ❌ Bad: 1つのタスクにまとめすぎ
[tasks.check]
run = "eslint . && stylelint **/*.css && tsc && jest"
セキュリティ
# ❌ Bad: 秘密情報を .mise.toml に直接書く
[env]
API_KEY = "secret-123"
# ✅ Good: .env ファイルから読み込む
[env]
_.file = ".env" # .env を .gitignore に追加
# ✅ Good: テンプレート変数を使う
[env]
CONFIG_FILE = "{{ config_root }}/config.json"
パフォーマンス最適化
並列インストール
# 複数のツールを並列でインストール
mise install node@20 python@3.12 go@1.21 --jobs 4
キャッシュの活用
# キャッシュディレクトリの確認
mise cache
# キャッシュクリア
mise cache clear
トラブルシューティング
デバッグモード
# デバッグ情報を表示
MISE_DEBUG=1 mise install node@20
# より詳細なログ
MISE_LOG_LEVEL=trace mise install node@20
環境の確認
# mise の状態を確認
mise doctor
# インストール済みツール
mise ls
# 現在有効な設定
mise current
まとめ
miseは、開発環境管理を統合的に行える強力なツールです。asdfの代替として、さらに高速で使いやすくなっています。
重要なポイント
- 統合管理: バージョン管理 + タスクランナー + 環境変数
- asdf互換:
.tool-versionsをそのまま使える - 高速: Rust製で並列インストール可能
- TOML設定:
.mise.tomlで直感的に設定 - 豊富なプラグイン: 500以上のツールをサポート
ユースケース
- マルチ言語プロジェクト: Node.js + Python + Go
- モノレポ: 統一されたツールバージョン
- チーム開発:
.mise.tomlをgit管理 - CI/CD: GitHub Actionsでも同じ設定を使える
- 開発環境の再現: 新メンバーのオンボーディング
miseを使えば、nvm、pyenv、rbenv、gvmなどを個別にインストールする必要がなくなります。