【Flutter】Dart3リリースにあわせて読みたいpubspecの要求sdkバージョンの話
はじめに
Flutter開発時にパッケージの依存などを記述するpubspec.yamlについて、pubspecの要求sdkバージョン周りの話を雑多に書きました。
3本立てです。
dart sdkの要求バージョン
pubspec.yamlのenviromentにはdartやflutter sdkの要求バージョンを記述します。
以下の場合はdart sdkが2.17.0以上3.0.0未満であることを要求します。
environment:
sdk: ">=2.17.0 <3.0.0"
sdkバージョンの制約はFlutterアプリのプロジェクトだけでなく、依存するパッケージにも設定されています。
例えば以下のように指定されているパッケージに依存している場合
environment:
sdk: '>=2.19.0 <3.0.0'
pubspec.lockが以下のようになります。
sdks:
dart: ">=2.19.0 <3.0.0"
この状態で例えばdart 2.18.6を使っているflutter 3.3.10を使うとpub getでエラーになります。
custom_lintパッケージがdart 2.19.0以上を要求しているのでエラーになっています👀
[flutter_mcu_sample] flutter pub get
Running "flutter pub get" in flutter_mcu_sample...
The current Dart SDK version is 2.18.6.
Because flutter_mcu_sample depends on custom_lint >=0.2.11 which requires SDK version >=2.19.0 <3.0.0, version solving failed.
pub get failed (1; Because flutter_mcu_sample depends on custom_lint >=0.2.11 which requires SDK version >=2.19.0 <3.0.0, version solving failed.)
exit code 1
dart 3で発生するはずの問題
dart 2のころまでFlutterプロジェクトやパッケージを作成すると以下のような感じで、最大バージョンが3.0.0未満となっていました。
environment:
sdk: ">=2.17.0 <3.0.0"
dart 3を使うFlutter 3.10.0以降でプロジェクトを作ると、当然以下のように最低バージョンが3.0.0以上になるので、上記のような制約のパッケージに依存している場合に制約が満たせなくなります。
environment:
sdk: ">=3.0.0 <4.0.0"
順当に考えると依存パッケージがすべて最大バージョンが4.0.0未満になるようにアプデされる必要があります。
この問題に対してどうしているのか調べたところ以下のPRを見つけました。
詳細はコードを読んでもらうのが早いのですが、要求sdkバージョンの最小がdart 2.12.0以上のときに、最大バージョンを3.0.0未満から4.0.0未満に置き換えるようにしています。
2.12.0はdartがnull safetyに対応したバージョンです。
この対応で問題が起こらなくなっているようでした。
結構力技ですね😄
自作パッケージを作成する場合どのバージョンを指定するのが無難か
flutterfireは公式に従っているそうなので、それを基準にするのが良さそうです。
記事執筆時点では以下です。
environment:
sdk: '>=2.18.0 <4.0.0'
flutter: '>=3.3.0'
もちろんFlutterに依存しないパッケージならflutterの行は不要です。
また、より新しいsdkのAPIを使う場合はそのバージョンを指定しましょう。その際、パッケージの要求sdkバージョンは適度に広いほうが良いです。
例えばflutter 3.3.0までのAPIしか使ってないのに、flutter: '>=3.10.0'としてしまうと最新のFlutterにアプデできてない人を切り捨てることになってしまいます。
まとめ
pubspecに記述する要求sdkバージョン関連の話でした。
ちょっと自信ないので、間違ってるよ〜みたいなの気づいたらコメントいただきたいです🙇♂️
Discussion
ちなみにご存知かもしれませんが、Dart 2.19からSDKの指定にもキャレット形式で書けるようになっていたそうです。
知らなかったです😅
よさそうですね👍