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

2023/08/29に公開

Flutterバージョン管理ツールPuroを触ってみます。

  • 公式サイト
  • 複数のプロジェクトで異なるバージョンのFlutterを利用できる、FVMのようなFlutter SDKのバージョン管理ツールです。
  • ストレージ容量やインターネット帯域幅を節約し、新バージョンを2倍の速度でダウンロードできます。
  • FVMはグローバルなバージョン管理に対応しなくなりましたが、Puroはグローバルなバージョン管理に対応しています。
  • IDEの設定を自動的に行うことができます。

パフォーマンス

公式サイトによると

  • Puroでの初回インストールはFVMに比べて20%高速化されます。
  • 2回目以降のインストールは50〜95%高速化されます。
  • 仕組み
    • gitクローンの並列化
    • git履歴のグローバルキャッシュ
    • Flutterエンジンバージョンのキャッシュ
    • GitLabのオブジェクト重複排除に似た技術を実装

インストール

Mac

curl -o- https://puro.dev/install.sh | PURO_VERSION="1.3.5" bash

Linux

curl -o- https://puro.dev/install.sh | PURO_VERSION="1.3.5" bash

Windows

Invoke-WebRequest -Uri "https://puro.dev/builds/1.3.5/windows-x64/puro.exe" -OutFile "$env:temp\puro.exe"; &"$env:temp\puro.exe" install-puro --promote

私はMacにインストールしました。

実行ファイルは$HOME/.puro/binにインストールされ、パスを通す必要がありました。

以下が.puroの構成です。

.puro
├── bin
│   └── puro
├── envs
└── prefs.json

作業後は以下のようになります。(Level 3まで出力)

.puro
├── bin
│   └── puro
├── envs
│   └── newest
│       ├── flutter
│       ├── prefs.json
│       └── update.lock
├── prefs.json
├── releases_macos.json
└── shared
    ├── caches
    │   └── b20183e04096094bcc37d9cde2a4b96f5cc684cf
    ├── flutter
    ├── flutter_tools
    │   └── e1e47221e86272429674bec4f1bd36acc4fc7b77
    └── pub_cache
        ├── README.md
        ├── _temp
        ├── hosted
        └── hosted-hashes

利用方法

Puroはenvironmentを定義して利用します。

公式サイトから引用
# Create new environment from a release channel
puro create my_env stable

# Or from a version
puro create my_env 3.3.6

# Or from a commit
puro create my_env d9111f6

# Or from a fork
puro create my_env --fork git@github.com:pingbird/flutter.git

作成したmy_envを利用するには以下のコマンドをFlutterプロジェクト内で実行します。

puro use my_env

またPuroはVSCodeやAndroid Studioの利用を自動的に検出して、必要な設定を行います。
新規プロジェクトの場合は--vscode--intellijを追加して設定を生成します。

グローバル設定

グローバルデフォルトの設定は--globalもしくは-gを利用して行います。

puro use -g my_env

コマンド

利用できるコマンド一覧です。

Available commands:
  clean            Deletes puro configuration files from the current project and restores IDE settings
  create           Sets up a new Flutter environment
  dart             Forwards arguments to dart in the current environment
  engine           Manages Flutter engine builds
  eval             Evaluates ephemeral Dart code
  flutter          Forwards arguments to flutter in the current environment
  gc               Cleans up unused caches
  ls               Lists available environments
  ls-versions      Lists available Flutter versions
  pub              Forwards arguments to pub in the current environment
  repl             Interactive REPL for dart code
  rm               Deletes an environment
  run              Forwards arguments to dart run in the current environment
  uninstall-puro   Uninstalls puro from the system
  upgrade          Upgrades an environment to a new version of Flutter
  upgrade-puro     Upgrades the puro tool to a new version
  use              Selects an environment to use in the current project
  version          Prints version information

ls-versionsを実行したところ、分かりやすいフォーマットで表示されました。

> puro ls-versions
[i] Latest stable releases:
    Flutter 3.13.1         | 5d  | e1e47221e8 | Dart 3.1.0 
    Flutter 3.13.0         | 2w  | efbf63d9c6 | Dart 3.1.0 
    Flutter 3.10.6         | 2mo | f468f3366c | Dart 3.0.6 
    Flutter 3.10.5         | 2mo | 796c8ef792 | Dart 3.0.5 
    Flutter 3.10.4         | 3mo | 682aa387cf | Dart 3.0.3 
    Flutter 3.7.12         | 4mo | 4d9e56e694 | Dart 2.19.6
    Flutter 3.3.10         | 8mo | 135454af32 | Dart 2.18.6
    Flutter 3.0.5          | 1y  | f1875d570e | Dart 2.17.6
    Flutter 2.10.5         | 1y  | 5464c5bac7 | Dart 2.16.2
    Flutter 2.8.1          | 2y  | 77d935af4d | Dart 2.15.1
    
    Latest beta releases:
    Flutter 3.14.0-0.1.pre | 1w  | 120d54d33a | Dart 3.2.0 
    Flutter 3.13.0-0.4.pre | 2w  | 7e07cd41cb | Dart 3.1.0 
    Flutter 3.13.0-0.3.pre | 3w  | e90f5d4561 | Dart 3.1.0 
    Flutter 3.13.0-0.2.pre | 1mo | ac71592bc6 | Dart 3.1.0 
    Flutter 3.13.0-0.1.pre | 2mo | 1f6bdb6fa2 | Dart 3.1.0 
    Flutter 3.12.0         | 3mo | 8fcb74dbc1 | Dart 3.1.0 
    Flutter 3.11.0-0.1.pre | 3mo | 350d2c3a6c | Dart 3.1.0 
    Flutter 3.10.0-1.5.pre | 4mo | b1c77b7ed3 | Dart 3.0.0 
    Flutter 3.9.0-0.2.pre  | 5mo | 0df8557c56 | Dart 3.0.0 
    Flutter 3.8.0-10.1.pre | 6mo | 1a0a03a41d | Dart 3.0.0

実際に利用してみる

> puro create newest 3.13.1
> puro use newest

VSCode設定のsettings.jsonに以下の設定が追加されました。

{
    "dart.flutterSdkPath": "/Users/username/.puro/envs/newest/flutter",
    "dart.sdkPath": "/Users/username/.puro/envs/newest/flutter/bin/cache/dart-sdk"
}

Android Studio(IntelliJ)の設定は失敗しているようです。Issueがありました。
PuroでインストールしたFlutter SDKを手動で設定して、動作が確認できました。
今後修正されると思います。

その他

  • Dartのバージョン管理には対応していないので、ls-versionsコマンドでDartのバージョンを確認してそれに対応するFlutterバージョンをインストールします。参考: https://github.com/pingbird/puro/issues/22
  • environmentの名前の変更コマンドは現在のところ存在しません。フォルダーをリネームすることで対応します。参考: https://github.com/pingbird/puro/issues/37
  • Flutterバージョンを直接useコマンドに指定できるようにするIssueが出されています。

感想

  • environmentの定義が手間に感じましたが、今後Flutterのバージョンを直接指定できるようになるかもしれないので、期待しています。
  • IntelliJでは使用するFlutterのバージョンを変更するたびに設定を変更する必要がありましたが、自動設定が正しく動くようになれば非常に便利だと思います。
  • パフォーマンスの向上は複数プロジェクトを管理する場合に大きなメリットがあると思います。
  • FVMはプロジェクト内に設定を作成しますが、Puroはグローバルに設定を作成するので、プロジェクトに直接関係ないファイルが作成されないのが良いと思いました。ただし、VSCodeでの設定はホームのファイルを参照するので、一長一短です。
  • CI/CDでの利用はどうなるのか気になります。
  • すぐにFVMから移行する必要性は高くないと思いますが、私は複数のプロジェクトに関わっているので注視していこうと思います。
合同会社CAPH TECH

Discussion