Flutterでアプリを作っていると、https://pub.devで見つけたパッケージを使うことになると思います。しかし、これらのパッケージは日々更新されていて、依存したパッケージをアップデートせずに放置していると、セキュリティ的にも問題があるし、iOSやAndroidの各プラットフォームの更新に対応できなくなってしまう可能性があります。
今回はFlutterのパッケージやプラグインをアップデートするのに便利なコマンド等を紹介していきたいと思います。
古くなったパッケージがないか確認する
まず、自分のアプリが依存しているパッケージの中に、アップデートが必要なものが含まれているのか確認します。下記のコマンドを使います。
dart pub outdated
しばらくアップデートしていないと結構長いリストが出力されるはずです。以下はアプトプットの例です。
Showing outdated packages.
[*] indicates versions that are not the latest available.
Package Name Current Upgradable Resolvable Latest
direct dependencies:
audio_session *0.1.0 0.1.5 0.1.5 0.1.5
cupertino_icons *1.0.2 1.0.3 1.0.3 1.0.3
json_serializable *4.1.0 *4.1.4 *4.1.4 5.0.0
just_audio *0.7.4+1 *0.7.5 0.9.5 0.9.5
package_info *2.0.0 2.0.2 2.0.2 2.0.2
path_provider *2.0.1 2.0.2 2.0.2 2.0.2
shared_preferences *2.0.5 2.0.6 2.0.6 2.0.6
url_launcher *6.0.3 6.0.9 6.0.9 6.0.9
dev_dependencies:
・・・
transitive dependencies:
・・・
transitive dev_dependencies:
・・・
46 upgradable dependencies are locked (in pubspec.lock) to older versions.
To update these dependencies, use `dart pub upgrade`.
3 dependencies are constrained to versions that are older than a resolvable version.
To update these dependencies, edit pubspec.yaml, or run `dart pub upgrade --major-versions`.
パッケージをアップデートする
pubspec.yaml
ファイルの内容を編集して、dart pub upgrade
を実行する方法がありますが、パッケージが多いと結構手間になると思います。まずは以下のコマンドを事項することで、一括でアップデートが適用されます。
dart pub upgrade --major-versions
これを実行することで、dart pub outdated
のアウトプットがかなりスッキリしたものになるのではないでしょうか。
上記で解決できなかったパッケージについては、手動でpubspec.yaml
ファイルに記述されているバージョンをResolvable
列に記載されている値に修正して、flutter pub get
を実行することでほとんどのパッケージは最新のものに修正できるはずです。
ここで一旦大きなバグが発生していないか、確認します。バグが発生してしまった場合は、一旦コードを元に戻して、パッケージを1つずつ手動でアップデートしていきます。
それでもアップデートできないパッケージ
今回、json_serializable
というパッケージのResolvable
バージョンと最新バージョンが異なっていて、pubspec.yaml
ファイルで5.0.0に設定しても、以下のエラーがでて更新がうまくいきません。
Running "flutter pub get" in flag_app...
Because every version of flutter from sdk depends on meta 1.3.0 and analyzer >=2.0.0 depends on meta ^1.7.0, flutter from sdk is incompatible with analyzer >=2.0.0.
And because json_serializable >=5.0.0 depends on analyzer ^2.0.0, flutter from sdk is incompatible with json_serializable >=5.0.0.
So, because flag_app depends on both flutter any from sdk and json_serializable ^5.0.0, version solving failed.
pub get failed (1; So, because flag_app depends on both flutter any from sdk and json_serializable ^5.0.0, version solving failed.)
exit code 1
transitive dependencies
セクションに含まれるmeta
とanalyzer
というパッケージが問題になっています。上記のメッセージによるとsdkのflutterの全てのバージョンがmeta 1.3.0
に依存しており、meta ^1.7.0
に依存するanalyzer >=2.0.0
はflutterと互換性がない、とのことです。
つまり、analyzer ^2.0.0
に依存するjson_serializable 5.0.0
もflutterとの互換性がないという結論のようです。正直、flutterで使うことが前提のパッケージが、flutterの最新安定板と互換性がないというこの状況が理解できません。とりあえずアプリの動作には問題なさそうなので、いずれ修正されるバグであると信じて、様子を見ることにします。※今後何か進展があれば、追記します。
まとめ
しばらく放置していたアプリを一気にアップデートしようとしてエラーが発生した場合、過去のどの時点でどのパッケージが原因で発生したエラーなのか、判断することが困難になることも考えられます。
アプリを開発したら、こまめに依存パッケージやプラットフォームの更新に対応する習慣をつけるようにしましょう。