🐙

【Flutter】Dart3リリースにあわせて読みたいpubspecの要求sdkバージョンの話

2023/05/18に公開2

はじめに

Flutter開発時にパッケージの依存などを記述するpubspec.yamlについて、pubspecの要求sdkバージョン周りの話を雑多に書きました。
3本立てです。

dart sdkの要求バージョン

pubspec.yamlのenviromentにはdartやflutter sdkの要求バージョンを記述します。
以下の場合はdart sdkが2.17.0以上3.0.0未満であることを要求します。

pubspec.yaml
environment:
  sdk: ">=2.17.0 <3.0.0"

sdkバージョンの制約はFlutterアプリのプロジェクトだけでなく、依存するパッケージにも設定されています。
例えば以下のように指定されているパッケージに依存している場合

pubspec.yaml
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未満となっていました。

pubspec.yaml
environment:
  sdk: ">=2.17.0 <3.0.0"

dart 3を使うFlutter 3.10.0以降でプロジェクトを作ると、当然以下のように最低バージョンが3.0.0以上になるので、上記のような制約のパッケージに依存している場合に制約が満たせなくなります。

pubspec.yaml
environment:
  sdk: ">=3.0.0 <4.0.0"

順当に考えると依存パッケージがすべて最大バージョンが4.0.0未満になるようにアプデされる必要があります。
この問題に対してどうしているのか調べたところ以下のPRを見つけました。
https://github.com/dart-lang/pana/pull/1175
詳細はコードを読んでもらうのが早いのですが、要求sdkバージョンの最小がdart 2.12.0以上のときに、最大バージョンを3.0.0未満から4.0.0未満に置き換えるようにしています。
2.12.0はdartがnull safetyに対応したバージョンです。
この対応で問題が起こらなくなっているようでした。
結構力技ですね😄

自作パッケージを作成する場合どのバージョンを指定するのが無難か

flutterfireは公式に従っているそうなので、それを基準にするのが良さそうです。
https://github.com/firebase/flutterfire/pull/10946

記事執筆時点では以下です。

pubspec.yaml
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バージョン関連の話でした。
ちょっと自信ないので、間違ってるよ〜みたいなの気づいたらコメントいただきたいです🙇‍♂️

GitHubで編集を提案
株式会社ゆめみ

Discussion

ツルオカツルオカ

Before Dart 2.19, pub disallowed caret syntax in SDK constraints. In earlier versions, provide a complete range, such as '>=2.12.0 <3.0.0'. For more information, check out the Caret syntax documentation
https://dart.dev/tools/pub/pubspec#sdk-constraints

ちなみにご存知かもしれませんが、Dart 2.19からSDKの指定にもキャレット形式で書けるようになっていたそうです。

environment:
  sdk: ^3.0.0
ログインするとコメントできます