🔧

Flutterアプリ開発のツール管理をFVMからmiseに移行する

に公開

こんにちは、IVRyのitochanです。

IVRyのアプリ開発チームでは、Flutterアプリ開発に使うツールの管理をFVMからmiseに移行しました。本記事ではmiseをFlutterアプリ開発で使う利便性をご紹介します。

なぜFVMからmiseに移行するのか

Flutterのバージョン管理といえばFVMがよく使われています。Flutterのバージョン管理に特化しているため、簡単なコマンド操作でFlutter SDKのダウンロード・バージョン固定が可能です。

# Flutter 3.35.7を利用する
$ fvm use 3.35.7
# または、Stableの最新バージョンを利用する
$ fvm use stable

FVMではFlutter SDKのみバージョン管理できます。Flutterアプリ開発ではFlutter SDKのみならず、CocoaPodsやCocoaPodsを使うためのRubyが必要です[1]。IVRyのアプリ開発ではNode.js製ツールも利用しているため環境構築にHomebrewを使ったりとステップが煩雑になっていました。そのため、Flutter以外の開発ツール管理ができるmiseに移行することにしました。

jdx/miseのリポジトリを見ると開発スピードが速く、リリースも頻繁に行われています。開発が活発に行われていることもmiseを利用する理由のひとつになりました。

miseに移行する

miseの環境構築をドキュメントを参照し済ませたあとの手順を記載します。リポジトリのルートでmiseコマンドを実行し、Flutterアプリで必要となるいくつかのツールのバージョンを定義します。

# 例: Flutter 3.35.7-stableを使用
$ mise use flutter@3.35.7-stable
# rubyとcocoapods gemの最新バージョン
# --pin をつけることでコマンド実行時点の最新バージョンで固定する
# (オプションがなければ常に最新バージョンを参照する)
$ mise use --pin ruby
$ mise use --pin gem:cocoapods
# Java 21
$ mise use java@zulu-21

これで mise.toml に書き込まれたのでリポジトリにコミットすれば完了です。

[tools]
flutter = "3.35.7-stable"
"gem:cocoapods" = "1.16.2"
java = "zulu-21"
ruby = "3.4.7"

あとは mise install を実行するだけです。

移行が完了すればFVMで使っていた .fvm/ ディレクトリや .fvmrc を削除することができます。

miseでインストールされたFlutter SDKのパスは mise which コマンドで確認できます。

$ mise which flutter
/Users/itochan/.local/share/mise/installs/flutter/3.35.7-stable/bin/flutter

VS Code/Cursorの設定

.vscode/settings.json にFlutter SDKのpathが設定されていればmiseを使うように修正します。

{
  "dart.flutterSdkPath": "~/.local/share/mise/installs/flutter/3.35.7-stable"
}

有志によるVSCode Extensionもあり、そちらでも mise.toml を読み込み settings.json の変更が行えます。

https://github.com/hverlin/mise-vscode

Android Studioの設定

Flutter SDK pathをmiseでインストールされたものにすれば完了です。

Android StudioのFlutter SDKをmiseで入ったSDKのパスに設定

https://mise.jdx.dev/ide-integration.html#jetbrains-editors-intellij-rustrover-pycharm-webstorm-rubymine-goland-etc

CI環境でmiseを実行する

miseはローカルの環境構築だけではなく、GitHub ActionsやXcode Cloud上で実行するFlutterやその他ツールのバージョン統一に役立ちます。

GitHub Actionsで動かす

GitHub Actionsでmiseを利用するには、mise公式のjdx/mise-actionを使います。

https://mise.jdx.dev/continuous-integration.html#github-actions

name: test
on:
  pull_request:
    branches:
      - main
  push:
    branches:
      - main
jobs:
  lint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v5
      # jdx/mise-actionを呼び出せば環境構築完了
      - uses: jdx/mise-action@v3

jdx/mise-action はデフォルトで mise install を実行してくれるため、これだけでローカルと同じ環境をGitHub Actions上で構築することができます。オプションを指定することでキャッシュの制御も可能です。

Xcode Cloudで動かす

IVRyではiOSアプリのCIにXcode Cloudを使っています。miseをXcode Cloudで使うことについてもmiseのドキュメントに実行例が記載されています。

https://mise.jdx.dev/continuous-integration.html#xcode-cloud

ci_post_clone.sh でmiseのインストールと初期設定を済ませばGitHub Actionsと同様に環境構築が完了します。

#!/bin/sh
curl https://mise.run | sh
export PATH="$HOME/.local/bin:$PATH"

mise install
eval "$(mise activate bash --shims)"

flutter --version

miseのタスクランナー機能

miseには開発ツールの管理だけではなく、タスクランナー機能もあります。FlutterアプリのLintやビルドのコマンドをタスクに定義することで、Dart/Flutterプロジェクト管理ツールとしてよく使われているMelosの代わりになります。

https://mise.jdx.dev/tasks/

IVRyではAIコーディングエージェントのDevinを使っています。Devinを使うにあたり、AIがコーディングするマシンの環境構築に必要なコマンドを定義する必要があります。.mise-tasks/ 配下にDevinから呼び出すスクリプトを置き、miseタスク化しました。

$ tree .mise-tasks
.mise-tasks
└── devin
    ├── lint.sh
    ├── maintain_dependencies.sh
    ├── setup.sh
    └── test.sh

$ mise tasks
Name                         Description
devin:lint
devin:maintain_dependencies
devin:setup
devin:test

Dart 3.6から追加されたPub workspacesはFlutter 3.27以降で使えます。ひとつのコマンドで複数のパッケージに対してタスクを実行することができるようになっています。

そのため必ずしもMelosを使う必要がなく、IVRyにおけるアプリ開発ではmiseのタスクランナーに移行することも視野に入れています。

mise移行を終えて

IVRyのアプリ開発で環境構築するには、miseが入っていればリポジトリのディレクトリで mise install を実行するだけで終わるようになりました。FVMだけでなくHomebrewも必要なくなりました。

miseはFlutterのみならず多くのツールがレジストリに登録されており、その総数は1000個近くにものぼります(2025年11月11日現在)。レジストリに存在しないパッケージもbackendという仕組みで必要に応じてPull Requestを出すこともできます。

https://mise.jdx.dev/dev-tools/backends/

https://mise.jdx.dev/tasks/

まとめ

miseへの移行により、IVRyのアプリ開発における開発環境の統一とセットアップの簡素化を実現でき、メンテナンスがしやすくなりました。

複数人でFlutterアプリを開発し、さらにローカルとCIの実行環境を揃えるのにmiseは最適です。FVM(とHomebrewなど)を使っているプロジェクトでmiseへの移行をお試しください。

脚注
  1. Swift Package Managerもありますが使っているライブラリすべてが移行しきれていないため、CocoaPodsを使い続けています。 ↩︎

IVRyテックブログ

Discussion