モノレポの flutter プロジェクトで fvm を導入してみた(い)
株式会社Sally 所属エンジニアの @wellPicker です。
弊社では、スマホやパソコンでマーダーミステリーを遊べるアプリであるウズや、マダミス情報・予約管理サイトマダミス.jp、マダミス開発ツールウズスタジオを開発しています。
最近になって fvm の存在を知って、できればチーム全体で導入したいなあ〜と思ったので、チームを説得するために fvm とはなんぞや? という記事を書くことにしました。fvm について詳しくない、あるいは全く知らない方が fvm について知る一助となれば幸いです。
対象読者
- Flutter の開発をしているが、fvm の存在を知らない方
- fvm によるメリット・デメリットを知りたい方
- 特に、モノレポ構成の Flutter プロジェクトに関わっている方
Flutter は約3ヶ月に一度、stable channel向けに新しいリリースが行われます。放置していると依存関係にあるパッケージで競合が発生したり、そもそも Flutter SDK のバージョンの違いによって挙動が変わったりしますので、頻繁にバージョンアップデートに対応する必要があります。fvm は、そうした Flutter の開発現場で役に立つツールです。
fvm とは?
fvm (Flutter Version Manager) は Flutter SDK のバージョン管理ツールです。具体的には以下のような役割を担います。
- 複数の Flutter SDK をインストールして管理 する。
- プロジェクトごとに使用する Flutter SDK のバージョンを自由に切り替えられる。
CLI ツールとして用意されているため、コマンド一つでバージョンを切り替えられます。Flutter と同じようにクロスプラットフォームで動作するので、Mac / Windows / Linux など環境を問わず導入しやすいのも利点です。
fvm のメリット
fvm を導入することによるメリットは以下のとおりです。
複数バージョンの共存
個人用のサンプルプロジェクトや会社の既存プロジェクト、それぞれが異なるバージョンの Flutter を使っている場合、ひとつのマシンでバージョン管理を一元化できるのは大きな利点です。
$ fvm use 3.24.5
$ fvm use 3.27.3
$ fvm use stable
例えば、異なるプロジェクトのタスクを並行して進めたり、あるいは同じプロジェクト内でも Flutter SDK のバージョンの移行中などで、頻繁に Flutter のバージョンを切り替えながら作業したい場面もあると思います。
そうした場合も、 fvm を導入していればコマンドを一つ実行するだけで簡単に利用する SDK バージョンを切り替えることが可能です。あらかじめ複数の Flutter SDK バージョンをインストールしておくため、いちいちインストールし直す手間や時間がかからないのは大きなメリットです。
チームで Flutter SDK のバージョンを揃えやすい
プロジェクトで利用する Flutter SDK のバージョンをチーム全体で統一しておかないと、「Aさんのビルドは通るけどBさんのビルドは通らない」といった問題が発生します。
fvm を導入していれば、プロジェクト直下に自動生成される .fvmrcファイルが参照されるので、チーム全体で統一された Flutter SDK バージョンを使って開発することが可能です。
fvm のデメリット
一応、fvm が持つデメリットについても説明したいと思います。
ストレージを圧迫する
複数の Flutter SDK バージョンをインストールする都合上、どうしてもストレージを圧迫してしまうという問題はあります。
コマンドに prefix が必要
例えば特定のプロジェクト内で fvm によってバージョンを指定している場合、そのバージョンを使用ししてビルドをするためには
fvm flutter run
のように fvm という prefix をつける必要があるので、わずかに手間が増えます。後述する fvm global コマンドで指定したデフォルトのバージョンを使用することで一応このデメリットは回避できますが、一時的に利用バージョンを切り替えたりするためにはどうしても prefix が必要です。
チームメンバー全員が導入しないと、メリットを十分に発揮できない
メリットの裏返しですが、自分一人だけが fvm を導入していても、チーム全体で Flutter SDK バージョンを統一することができません。そうなると、例えば Slack 上なんかで「アップデートに対応したので以降は Flutter 3.27.3 を使ってください!」みたいな方法でバージョンを共有する必要があり、非効率的になってしまいます。
fvm の導入方法
弊社では Mac ユーザーが比較的多いので、ここでは Homebrew 経由での導入方法を説明したいと思います。
インストール
brew tap leoafarias/fvm
brew install fvm
バージョン確認
fvm --version
"3.2.1" みたいな感じでバージョンが表示されれば、インストールできています。
その他の OS の場合は、fvm の公式ドキュメントを参考にしてください。
ちなみに、通常の Flutter SDK と fvm を同時に導入すると競合が発生することがあるらしいので、fvm を導入する場合はそれ以外の方法で導入した Flutter SDK は削除した方が良さそうです。
fvm の使い方
ここではモノレポ (melos を併用) を想定して、簡単な使い方を紹介します。
プロジェクトで使用するバージョンを指定する
cd path/to/your/monorepo
fvm use 3.10.5
fvm use コマンドを実行することで、利用する Flutter SDK バージョンを指定することができます。注意すべき点として、基本的にこのコマンドはプロジェクトのルート直下で実行する必要があります。正しく実行できていれば、ルート直下に .fvm ディレクトリと .fvmrc ファイルが自動で生成されるはずです。
melos を併用している場合は、melos.yaml 内で下記のように sdkPath を指定することで、すべてのスクリプトや melos コマンドが fvm use で指定したバージョンで実行されるようになります。
sdkPath: .fvm/flutter_sdk
デフォルトで使用する flutter SDK バージョンを指定する
fvm global 3.27.3
このコマンドを実行すると、デフォルトで使用する Flutter SDK バージョンを指定することが可能です。flutter run
のような感じで fvm の prefix をつけない場合、fvm global で設定した SDK バージョンを参照します。
現在のプロジェクトで使用している Flutter SDK バージョンを確認する
fvm list
コマンドを使用することで、
- 現在 global に設定されている SDK バージョン
- 現在のプロジェクトで使用している SDK バージョン
- マシンにインストールされている SDK バージョン
を確認することが可能です。
活用例
ウズのプロジェクトは先日、 Flutter 3.27.3 にアップデートするタイミングがありました。バージョンアップデートによるデグレが発生しないか、また依存関係の競合が発生しないか確認する必要があるため、必然的にアップデート対応には時間がかかります。
しかし、その間他にも対応しなければならないタスク(バグ対応など)はあるため、アプデ対応と並行しながらそれらの作業を行う必要があります。その時に、今はバージョン 3.27.3 を使いたい、今はバージョン 3.24.5 で作業したい、など頻繁にバージョンを切り替えたい状況でした。
以前はこのような場合に、定期的に
cd ~/user/Development/flutter
git checkout 3.24.5
のようなコマンドを実行する必要がありました。その都度 Flutter SDK をインストールするため切り替えにかなり時間がかかっていたのですが、 fvm を利用するようになってからはあらかじめローカルに複数の Flutter SDK がインストールされているため、バージョンの切り替えにかかる時間を大幅に短縮することが可能になりました。
まとめ
Flutter の開発現場で「複数の Flutter SDK バージョンを扱う必要がある」「チームでバージョンを統一したい」という場合、fvm は非常に有用なツールです。モノレポの場合は一度に複数の Flutter SDK バージョンを扱う機会は少ないかもしれませんが、それでも恩恵を感じられる機会は多いでしょう。
一方で、メンバー全員が導入しないとそのメリットが十分に発揮されなかったり、複数のバージョンのSDKを持つぶんストレージを圧迫するなど、注意点もあります。
とはいえ、デメリットよりもメリットの方が大きいので、Flutter 開発を行うチームであればぜひ採用を検討してみてはいかがでしょうか。
Discussion