
はじめに
こんにちは。この記事はニフティの坂野とmoriです。この記事は共同執筆したものになります。
チームで開発をしていると、python,node.js等の実行環境やlinter,formatter等周辺ツールのバージョンを揃えたい、という場面は多いと思います。
そこでまず思いつくのがdevcontainerですが、ケースバイケースでオーバーエンジニアリングになりがちだと思っています。
やりたいのは「ツールのバージョンを揃える」だけなのに、コンテナ丸ごと用意するのは重すぎます。
- Dockerfileやdevcontainer.jsonの構築・メンテナンスコストがかかる
- CI/CDで同じツールバージョンを使いたいとなると、GitHub Actions側でもコンテナビルドが必要になってさらに複雑化
- ツール追加のたびにビルドし直し
これらの問題は、miseを使えばもっとシンプルに解決できます。
miseの強み
miseはツールチェイン管理、環境変数管理、タスクランナーなど様々な機能を持つツールです。
以前はRTXという検索性の悪い名前でしたが、いつの間にか改名されていました。
mise.tomlというファイル1つで全部管理できます。
ローカル/CIで同じバージョン
mise.tomlをリポジトリにコミットしておけば、ローカルでもGitHub Actionsでも同じツールバージョンが使えます。
CI側ではjdx/mise-actionを使うだけです。コンテナビルドは要りません。
TerraformのCIは例えばこんな感じで書けます。
|
1 2 3 4 5 6 7 8 |
# terraform-ci.yml steps: - uses: actions/checkout@v4 - uses: jdx/mise-action@v2 with: working_directory: terraform - run: mise check working-directory: terraform |
mise.tomlにツールもタスクも定義してあるので、CI側はmiseを入れてmise checkするだけです。
devcontainerだとCI用のDockerfileを別途用意したり、コンテナレジストリの管理も必要になりますが、miseならtomlファイル1つで完結します。
コンテナ不要で構築コストが低い
devcontainerは初回ビルドも再ビルドも待ち時間が発生します。
miseはmise installで必要なツールを直接インストールするだけなので、オーバーヘッドが小さいです。
新メンバーが入ってきたときもmise installだけで環境が揃うので、オンボーディングコストも低くなります。
ここからは、miseの各機能を紹介したあと、実際に弊社でどのように活用しているかを説明します。
Renovateでバージョンアップも自動化
Renovateはリポジトリ内の依存関係を自動検知し、バージョンアップのPRを自動で作成してくれるツールです。miseのmise managerにも対応しており、mise.toml内のツールバージョンを自動で検知してPRを作ってくれます。
前述の通り、mise.tomlはローカルとCIの両方で参照されるファイルです。つまり、Renovateがmise.tomlのバージョンを更新するだけで、ローカル環境とCIのツールバージョンが同時に更新されます。
弊社ではTerraformだけインフラへの影響が大きいので個別PRにし、それ以外のツール(tflint, trivy, gh cli等)はまとめて更新する設定にしています。
devcontainerだとDockerfile内のバージョン書き換え→イメージリビルドというフローが必要ですが、miseならtomlのバージョン文字列を書き換えるだけです。シンプルです。
miseの主な機能について
ツール管理
様々なバックエンドに対応しており、一通りのツールがバージョン指定付きでインストールできます。
- asdf
- aqua
- pipx
- npm
- cargo
|
1 2 3 4 5 6 7 8 9 10 11 |
# npmバックエンドを使用した claude codeのインストール mise use -g npm:@anthropic-ai/claude-code # pipxバックエンドを使用した serenaのインストール mise use pipx:git+https://github.com/oraios/serena.git@v0.1.4 # 直接手に入る系(nvim, btop, uvなどもあります) mise use uv # ツールのアップデート mise upgrade |
ディレクトリごとのバージョン切り替え
シェルの設定をすると、ディレクトリごとにツールバージョンを切り替えられます。上位ディレクトリの設定は下位にも引き継がれます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
~/hoge ❯ cat mise.toml [tools] uv = "latest" ~/hoge/fuga ❯ cat mise.toml [tools] uv = "0.8.1" ~/hoge/fuga ❯ uv --version uv 0.8.1 # fuga配下では0.8.1が使われる ~/hoge/piyo ❯ uv --version uv 0.8.23 # piyoではuv未定義だが、親のhogeの設定が効く |
環境変数管理
ツール使用時やタスク実行時に使用される環境変数をmise.tomlに記述しておけます。
ディレクトリ下にいると通常のシェルでも呼び出せます。
|
1 2 3 4 5 6 7 |
[env] EDITOR = "code" mise.file = ".env" [tasks.hoge] env = { fuga = "piyo" } run = "echo $fuga" |
.envを読み込むこともできるので、認証情報などはそちらに分離するのがおすすめです。
タスクランナー
mise.tomlに記述したタスクをmise run hogeで呼び出せます。
タスクを指定せずmise runするとTUIで選択できます。絞り込みも可能です。

ツールと同じく、上位ディレクトリのタスクも継承されます。
一例として、私が管理しているのTerraformリポジトリでは、fmt/lint/securityのチェックを全てmiseタスクで管理しています。dirで実行ディレクトリを指定できます。DockerfileのWORKDIRと概ね同じです。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
# terraform/mise.toml [tasks."fmt:check"] description = "Check Terraform formatting" dir = "cwd" run = "terraform fmt -check -recursive ." [tasks."lint:init"] description = "Initialize tflint plugins" dir = "cwd" run = "tflint --init --config=$MISE_PROJECT_ROOT/.tflint.hcl" [tasks."lint:check"] description = "Run tflint" dir = "cwd" depends = ["lint:init"] run = "tflint --recursive --config=$MISE_PROJECT_ROOT/.tflint.hcl" [tasks."security:check"] description = "Run trivy security scan" dir = "cwd" run = "trivy config --config=$MISE_PROJECT_ROOT/trivy.yaml ." |
おわりに
今回はmiseを使った開発環境のツール管理について紹介しました。参考になれば幸いです。


