PR

[Flutter]pubspec.yamlの「any」は常に最新版になる?過去記事の説明を整理

Flutter

はじめに

以前のFlutterの権限リクエストの記事で、パッケージのバージョンにanyを指定することを「常に最新版を使う設定」と書いていました。
ただ、この説明だと、flutter pub getを実行するたびに最新版へ更新されるようにも読めてしまいます。
今回は公式ドキュメントをもとに、anyとpubspec.lockの関係を整理します。

anyはバージョンを制限しない指定

pubspec.yamlには、次のように書けます。

dependencies:
  permission_handler: any

このanyは、そのパッケージのバージョンに制約を設けない指定です。「必ず最新版を取得する」という意味ではありません。

実際に使えるバージョンは、Dart SDKの条件や、ほかのパッケージとの依存関係も含めて決まります。最新版が公開されていても、条件が合わなければ選ばれません。

Dart公式のバージョン制約の説明でも、anyはすべてのバージョンを許す指定として説明されています。

pub getではpubspec.lockも使われる

もう1つ関係するのが、pubspec.lockです。

このファイルには、依存関係を解決して決まった具体的なバージョンが記録されます。pub getは、既存のlockfileにあるバージョンを、条件を満たす限り再利用します。

つまり、anyにしていても、取得済みのバージョンがそのまま使われることがあります。

pubspec.yamlは「使ってよい範囲」、pubspec.lockは「実際に使うことになったバージョン」。役割が違うんですね。

この挙動はDart公式のpub getの説明で確認できます。

バージョンの指定方法はどうする?

公式では、通常のバージョン指定にキャレット構文を勧めています。

たとえば、以下は書き方を説明するための例です。

dependencies:
  example_package: ^1.2.3

この場合は1.2.3以上、2.0.0未満を許可します。^0.1.2なら0.1.2以上、0.2.0未満です。先頭が0のときは範囲が違うので、ここも注意です。

範囲を指定しても、動作確認が不要になるわけではありませんが、anyのように無制限にはなりません。Dart公式のキャレット構文

依存パッケージを更新したい場合は、flutter pub upgradeを使います。こちらは既存のlockfileの固定を外し、指定した制約の範囲内で依存関係を解決し直すためのコマンドです。すべてのパッケージを無条件に最新版へ上げるものではありません。Dart公式のpub upgradeの説明

さいごに

過去記事の「常に最新版を使う設定」は、正確には「バージョン制約を設けない設定」でした。
anyだけで更新の動きが決まるわけではなく、依存関係とlockfileも関わる、という補足の備忘録でした。

おすすめ参考書

コメント

タイトルとURLをコピーしました