
はじめに
コドモンでエンジニアをしている羽馬です。
プロジェクトごとに、使用するツールや設定ファイルがバラバラな状態はよくあります。
「Node.jsはxx系、Javaはxx系。環境変数は .envrc で、タスク実行は Makefile で」といった具合です。
日頃から開発しているレポジトリであればまだしも、初見のプロジェクトでは異なります。nodenv などでバージョンを合わせて、.envrc を許可し、Makefile の内容を確認してタスクを実行するといった手順は、非常に手間がかかります。
こうした開発環境の「断片化」によるコストを解消するため、mise(ミーズ)を導入し、ツールのバージョン管理からタスクランナー機能までを一本化しました。
このブログでは、mise の概要と、導入によって開発フローがどう改善されるかを紹介します。
mise とは
mise(「ミーズ(meez)」、または「ミーズ・アン・プラス(mise -en -place)」と発音します)は、開発環境のフロントエンドを掲げるセットアップツールです。
その名前は、フランス料理の用語で「準備」や「配置」を意味するフレーズに由来しています。料理人が調理前に必要な調理器具や食材をすべて配置しておくという考え方を、ソフトウェア開発のプロジェクトへ応用しています。
mise を導入すると、mise.toml という1つの設定ファイルを通じて、プロジェクトの言語を問わず一貫した方法で開発環境を操作できます。 その機能は大きく以下の3つに分かれます。
1. 開発ツールの管理 (Dev Tools)
mise は複数の言語に対応したツールバージョン管理ツールであり、asdf,nvm,pyenv,rbenv といったツールをこれ1つで置き換えます。
Node.js、Python、Go など主要な言語は mise 本体に組み込まれた Core Tools として高速にインストールできます。それ以外のツールも、asdf プラグインや aqua、cargo、npm などのさまざまなソースからインストールできます。
2. 環境変数の管理 (Environments)
プロジェクトのディレクトリごとに環境変数のセットを切り替えることができます。 AWS_ACCESS_KEY_ID のような設定をプロジェクトごとに管理できます。direnv の役割を置き換える機能です。
3. タスクランナー (Tasks)
mise は、make や npm scripts に代わるタスクランナーとしての機能を備えています。 プロジェクト内の共通タスクを開発者間で共有したり、ファイルの変更を検知してタスクを自動実行したりできます。
mise への移行:実際の設定例
これまでバラバラに存在していた設定ファイルを、mise の設定(主に mise.toml)へまとめることで、環境をシンプルに保てます。以下は、私が実際に使用している mise.toml の例です。
ツールのバージョン管理
[tools] node = "24.13.0" pnpm = "10"
今までは .node-version や .nvmrc で Node.js のバージョンを管理していました。mise では [tools] セクションに記述するだけで、mise install を実行すれば必要なツールが一通り揃います。
セットアップタスク
[tasks.setup] description = "Install all dependencies" run = """ pnpm install echo "✅ Setup complete" """
プロジェクトに新しく参加したメンバーは、mise run setup を実行するだけで環境構築が終わります。
コード品質チェック
[tasks.format] description = "Format code with Biome" run = "pnpm format" [tasks.lint] description = "Lint code with Biome" run = "pnpm lint" # check, check:write, ci なども同様に定義
Makefile で定義していたタスクを mise に移行しました。mise run format や mise run lint で実行できます。
パッケージ別のタスク(モノレポ対応)
モノレポ構成では、パッケージごとにタスクを定義できます。dir オプションで作業ディレクトリを指定すれば、各パッケージの環境でコマンドを実行できます。
[tasks."vue:build"] description = "Build Vue components" dir = "components-vue" run = "pnpm build" [tasks."react:build"] description = "Build React components" dir = "components-react" run = "pnpm build" # vue:test, vue:storybook, react:test なども同様に定義
mise run vue:build や mise run react:build のように、パッケージ名を接頭辞として付けることで、どのパッケージに対する操作かがわかりやすくなります。
mise 導入のメリット
1. 環境構築がシンプルに
# Before: 複数のツールとコマンドが必要 $ nvm install $ nvm use $ corepack enable $ pnpm install # After: mise だけで完結 $ mise install $ mise run setup
2. ツールのバージョンが確実に合う
mise のタスクランナーの強力な点は、「そのプロジェクトで指定したツールのバージョンと環境変数を適用した状態」でタスクを確実に実行できることにあります。これにより、「make を実行したものの、Node.js のバージョン違いでエラーになる」といった、ツール間の連携ミスを防げます。
3. タスクの可視化
$ mise tasks format Format code with Biome lint Lint code with Biome check Check code with Biome (lint + format) vue:build Build Vue components vue:test Run Vue component tests react:build Build React components ...
新しいメンバーが「何ができるか」をすぐに把握できます。
GitHub Actions での活用
当初は GitHub Actions の actions/setup-node が mise.toml に対応していないため、CI 用に .node-version を残す必要がありました。しかし、jdx/mise-action を使うことで、この問題を解決できました。
# Before: 複数のアクションとバージョンファイルが必要 - uses: pnpm/action-setup@41ff72655975bd51cab0327fa583b6e92b6d3061 # v4.2.0 - uses: actions/setup-node@395ad3262231945c25e8478fd5baf05154b1d79f # v6.1.0 with: node-version-file: '.node-version' cache: 'pnpm' # After: mise-action だけで完結 - uses: jdx/mise-action@c53b9236f0b3370f31520f8b142f141256d839c6 # v3.6.0
mise-action は mise.toml を読み取り、Node.js や pnpm などのツールを自動的にセットアップしてくれます。これにより、.node-version ファイルが不要になり、ローカルと CI でバージョン管理を完全に一本化できました。
さらに、mise-action にはキャッシュ機能が組み込まれているため、actions/setup-node の cache: 'pnpm' オプションも不要になります。ワークフローがシンプルになるだけでなく、依存関係のインストール時間も短縮されます。
詳しくは mise の CI ドキュメント を参照してください。
まとめ
mise を導入することで、これまで .node-version、direnv、Makefile などに分散していた開発環境の設定を mise.toml に一本化できました。
バージョン管理は nvm / nodenv 、環境変数は direnv 、タスク実行は Makefile / npm scripts のそれぞれから mise へ移行できました。
開発環境のセットアップが mise install && mise run setup で完結するようになり、新規参加者の立ち上げの手間も削減されました。
開発環境の断片化に悩んでいる方は、ぜひ mise を試してみてください。
また、プラグイン機能を使えば、独自のツールやタスクを追加できます。まだアイディアベースではありますが、今後内部だけで利用するプラグインを作成していくのもありかなとワクワクしているこの頃です。