要約
- fvm、rbenv、nvmなどの複数のバージョン管理ツールをmiseに統一
-
mise.tomlでチーム内のツールバージョンを統一し、CI/CDとの連携も簡単に - 開発環境構築のハードルを大幅に下げることができた
はじめに
Flutterアプリ開発では複数のツールが必要になることが多く、以下のようなツールが一般的に使用されます:
- Flutter本体
- iOS開発のためのCocoaPods(Rubyが必要)
- Firebaseとの連携でNode.js
- その他のビルドツールやCLIツール
これらのツールでバージョンが異なると、様々な問題が発生します。
具体的な問題例:
- Flutterのバージョンが異なると、ビルドに違いが出たり、フォーマットがずれる
- CocoaPodsの場合、Rubyのバージョンが異なると
Podfile.lockのハッシュ値がずれる
意図しない差分が生まれることで、CI/CDの失敗やビルドエラーに繋がり、コードレビューの効率も低下させます。
従来は、fvm、nvm、rbenvなどの個別のバージョン管理ツールを使用していましたが、管理が煩雑になりがちでした。そこで、我々のチームではmiseを採用することにしました。
対象読者
- Flutter開発で複数のバージョン管理ツールに悩んでいる方
- チーム開発で環境の統一に課題を感じている方
- miseに興味がある方
miseとは
miseは、プロジェクトごとに必要なツールのバージョンを単一の設定ファイルで管理・自動切り替えできるコマンドラインツールです。
asdfの後継として開発されており、より高速で使いやすく設計されています。
miseはRustで書かれています
miseのメリット
- 統一管理: fvm、nvm、rbenvなどを個別にインストールする必要がない
-
設定の一元化:
mise.tomlファイルで全てのツールバージョンを管理 -
環境の分離:
~/.local/share/miseで管理されるため、システム環境を汚さない - 豊富なプラグイン: 多様なツールに対応
- 拡張機能: HooksやTasksで、チーム開発を加速
移行手順
1. 既存のfvm環境をクリーンアップ
# fvm関連を削除(プロジェクト直下)
rm .fvmrc
rm -rf .fvm
2. miseのインストール
# brewやwingetでインストール
brew install mise
# シェルに応じた設定を行う(例:zsh)
echo 'eval "$(mise activate zsh)"' >> ~/.zshrc
source ~/.zshrc
参考:
3. mise.tomlファイルの作成
プロジェクトルートにmise.tomlを作成します。我々のプロジェクトでは以下のように設定しました:
[tools]
flutter = { version = "3.35.1" }
ruby = { version = "3.4.4", os = ["macos"] }
node = { version = "22.19.0" }
"npm:firebase-tools" = "14.15.0"
"npm:cspell" = "9.2.0"
[hooks]
postinstall = [
"echo 🔧 Running post-install hooks...",
"gem install cocoapods -v 1.16.2 && echo '✅ Cocoapods installed successfully!'",
"dart pub global activate flutterfire_cli && echo '✅ FlutterFire CLI installed successfully!'",
"dart pub get && echo '✅ Flutter dependencies fetched successfully!'",
]
[tasks]
# ----- lint -----
[tasks."lint:spell"]
description = "Spell check via cspell"
run = "cspell --no-progress --dot --gitignore '**/*'"
[tasks."lint:analyze"]
description = "Dart analyze (fatal-infos)"
run = "dart analyze --fatal-infos clients/"
[tasks.lint]
description = "Run all linters"
depends = ["lint:spell", "lint:analyze"]
# その他、プロジェクト固有のタスクを定義
postinstallはmiseで用意されているフックの一つで、mise installコマンド実行後に自動で実行されます。これにより、ツールのインストール後に必要なセットアップを自動化できます。
また、toolsセクションでも、postinstallを書くことができます:
ruby = { version = "3.4.4", os = ["macos"], postinstall = "gem install cocoapods -v 1.16.2" }
ただし、これは初回インストール時にしか実行されないため、確実に実行されるhooksのpostinstallにまとめています。
CocoaPodsのインストールについて
gem:cocoapodsとしてインストールする方法もありますが、flutterfire configureでエラーになるため、postinstallでgem経由でインストールしています。
これは、Rubyがmiseで管理されたパッケージを見つけられないためです。
パスの違い:
gem installで入れた場合:
❯ which pod
~/.local/share/mise/installs/ruby/3.4.4/bin/pod
gem:xxxで入れた場合:
❯ which pod
~/.local/share/mise/installs/gem-cocoapods/1.16.2/bin/pod
gem:xxxで入れた場合、ツールとしては使用できますが、Rubyから見えないため、flutterfire configureでエラーになります。
4. ツールのインストール
# プロジェクトの信頼
mise trust
# Hooksの機能は現状実験的機能のため、以下のコマンドで有効化
mise settings experimental=true
# mise.tomlに記載されたツールをインストール
mise install
# インストール後、現在のバージョンを確認
mise current
5. 既存ツールのクリーンアップ(Optional)
fvm、rbenv、nvmなどの既存のバージョン管理ツールをアンインストールします。
既存のツールをアンインストールする前に、mise環境が正常に動作することを確認してください
実際に使ってみた感想
現在のところ、とても満足しています。特に以下の点が良かったです。
管理の簡素化
複数のバージョン管理ツールを覚える必要がなく、miseコマンド一つで全て管理できるようになりました。
チーム内での統一
mise.tomlをリポジトリに含めることで、チームメンバー全員が同じバージョンの環境で開発できます。
CI/CDとの連携
GitHub Actionsでも同じmise.tomlを参照できるため、ローカル環境とCI環境の差異を最小限に抑えられます。
- name: Install mise
uses: jdx/mise-action@v2
with:
experimental: true
cache: true
install: true
セットアップの自動化
hooksやtasksを使用することで、ツールのインストール後に自動でセットアップが実行され、新しいメンバーの環境構築時間を大幅に短縮できました。また、何か問題があった場合も、tasksの実行で解決できることが多くなりました。
Dockerとの比較
ホストマシンの性能をフルに使用できるため、特にFlutterのようなフレームワークの場合は、非常に有用だと感じています。
まとめ
fvmからmiseに移行することで、以下のメリットを得ることができました:
- 複数のバージョン管理ツールの統一
- チーム内での環境統一
- CI/CDとの連携簡素化
- 新規メンバーの環境構築時間短縮
特にFlutter開発のような複数の言語・ツールが必要なプロジェクトや、フロントエンドとバックエンドが混在するプロジェクトでは、miseの恩恵を大きく受けることができると感じています。チーム開発での環境統一に課題を感じている方は、ぜひmiseの導入を検討してみてください。