Flutterのバージョン管理ツールfvmを試してみる

## 概要
複数人でFlutterのプロジェクトの開発を行う場合、rbenvやnodenvの様に
誰でも同じバージョン(同じ環境)で開発できるようにしたいと思い、
Flutter sdkのバージョン管理ができそうなツールは無いか調べて見ました。

## Flutter sdkのversion管理ができそうなツール調査
ざっと調べた所以下の2つを発見 :eyes: 
<a href="https://github.com/leoafarias/fvm"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299271/e5382e2b-aace-c1ad-0ecc-0aba03699f94.png" width="460px"></a>
<a href="https://github.com/befovy/fvm"><img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/299271/6b8f5f53-4db9-44d2-8762-43f7c1d418f8.png" width="460px"></a>
どちらも同じ `fvm` という名前みたいです。
今回は pub で公開されている `leoafarias/fvm` を使ってみたいと思います。
できる機能としては以下になります。

- プロジェクトごとに Flutter SDK のバージョンを設定して使用する
- 複数の Flutter SDK バージョンのインストールとキャッシュ機能
- Flutter channels & versionsの高速切り替え
- IDEデバッグをサポートするためのダイナミックSDKパス
- チームとCI環境全体で一貫性を保つために、プロジェクトでFVM構成をバージョン管理
- プロジェクト間でのグローバルな Flutter バージョンの設定

## 環境構築
早速pubを使って `fvm` をインストールします。

```sh
$ pub global activate fvm
# 又は
$ flutter pub global activate fvm
```
次にパスを通します。
※dartのパスも必要で flutter-sdkのみインストールしている場合は、別途dartをインストールするか、flutter-sdk内にあるdartのパスを設定します。
(個人的に複数のdart環境をインストールしたくないので、今回はflutter-sdk内にあるdartを再利用しています)

```sh
# fvmのパス
$ export PATH="$PATH":"$HOME/$FLUTTER_SDK_PATH/.pub-cache/bin"
# dartのパス
$ export PATH="$PATH":"$HOME/$FLUTTER_SDK_PATH/cache/dart-sdk/bin"
```

`fvm help` でヘルプが表示されればOKです。

### 2021/08/11追記
[こちら](https://fvm.app/docs/getting_started/installation)に **Homebrew** や **Chocolatery** でもインストールできるようになったと記述されているので
そちらを使った方が良いかもしれません。
## 使い方

- インストール可能なリリース済みのバージョン一覧を確認する場合

    ```sh
    $ fvm releases
    # stable / dev / beta それぞれが一覧表示される
    ```

- 現在インストールされているバージョンの一覧を表示

    ```sh
    $ fvm list
    ```

- 特定のSDKバージョンをインストールする

    ```sh
    $ fvm install <version>
    ```

- プロジェクト内でのSDKバージョンを固定する

    ```sh
    $ fvm use <version>
    ```
    プロジェクト内に `./fvm` が作成されます。
    `.fvm`内は `.fvm/fvm_config.json` と、`.fvm/flutter_sdk` が作成され、
    `.fvm/flutter_sdk` の方は `/Users/xxxx/fvm/versions/<version>` のシンボリックリンクとなっています。

- プロジェクト内で固定されたSDKバージョンを使用する
    プロジェクト内に  `.fvm/fvm_config.json`  がある状態で以下を実施

    ```sh
    $ fvm install
    ```

- VSCodeで使う場合

    ```json
    {
      "dart.flutterSdkPath": ".fvm/flutter_sdk"
    }
    ```
    ↑をプロジェクト直下の `.vscode/settings.json` に追加し、再起動します。
    【追記】
    settings.jsonには [dart.flutterSdkPath](https://dartcode.org/docs/settings/#dartfluttersdkpath)と[dart.flutterSdkPaths](https://dartcode.org/docs/settings/#dartfluttersdkpaths)が設定でき、
    前者は1つのSDKのみ指定でき、後者は複数SDKを指定でき、VSCode上で切替可能です。

    gitignore には

    ```
    .fvm/flutter_sdk
    .vscode/settings.json
    ```

    を追加しました。

- AndroidStudioで使う場合
  VSCodeでしか試してないのですが、[こちら](https://github.com/leoafarias/fvm#android-studio)にセットアップ方法が載っていました :sparkles: 

## 新規プロジェクトをfvm使用して特定のバージョンで作成する
通常は既存のflutter projectでしか `use` コマンドは使用できないが、
`--force` フラグを使用することでflutter project以外のディレクトリでも使用可能になります。
新規のプロジェクトをfvmを使用して作成する場合、一旦ディレクトリを先に作成して `--force` フラグ付きでバージョンを固定し、プロジェクトを作成します。

```shell
$ mkdir sample_project
$ cd sample_project
$ fvm use <version> --force
$ fvm flutter create .
```

## 感想
クロスプラットフォームでの開発の場合、バージョン更新したらエラーの嵐で大変だった。。という経験があったので
プロジェクト内でバージョン固定できてメンバー間に共有できる所はとてもありがたいなと思いました。
もしかしたら他に良いツールや方法等があるかもしれないですが、現時点ではfvmを使っていきたいと思います。