【Flutter】pubspec.yamlでのライブラリバージョン指定とセマンティックバージョニングについて

こんにちは。エキサイト株式会社でエンジニアをしている岡島です。

今回は、pubspec.yamlでのパッケージの管理について、調べたことを共有していこうと思います。

pubspec.yamlでのバージョン指定方法

pubspec.yamlファイルでは、さまざまな方法でパッケージのバージョンを指定できます。主な指定方法は以下の通りです。

バージョン指定なし

空欄やanyで指定すると全てのバージョンを許容します。

dependencies:
  hoge:
  fuga: any # 空欄のバージョン制約の明示的な宣言として機能

指定されたバージョン

指定されたバージョンのみを使用します。

dependencies:
  hoge: 1.2.3

バージョンの範囲指定

不等号を使用することで、指定バージョン以上や以下などの範囲指定ができます。組み合わせることも可能で、値を >=1.2.3 <2.0.0のように指定すると、1.2.3以上2.0.0未満の任意のバージョンという意味になります。

dependencies:
  hoge: >=1.2.3 # 1.2.3以上のバージョンを使用
  fuga: >1.2.3 # 1.2.3よりも後のバージョンを使用

キャレット構文での指定

キャレット^ を用いることで、指定されたバージョンからメジャーバージョンが変わらない範囲で最新のものを使用できます。

キャレット構文でのバージョン指定は、パッケージ管理のベストプラクティスとしてDartのドキュメント紹介されています。

https://dart.dev/tools/pub/dependencies#use-caret-syntax

dependencies:
  hoge: ^1.2.3  # 1.2.3以上2.0.0未満のバージョンという意味

パッケージバージョンのアップグレード

flutter pub upgradeコマンドを使用して、依存関係を最新のバージョンに更新できます。

通常のアップグレード

flutter pub upgrade

このコマンドは、pubspec.yamlファイルで指定された制約内で、最新の互換性のあるバージョンにアップグレードします。

メジャーバージョンを含むアップグレード

flutter pub upgrade --major-versions

このコマンドは、メジャーバージョンの更新も含めて、利用可能な最新のバージョンにアップグレードします。pubspec.yamlファイルの制約も自動的に更新されます。

セマンティックバージョニングとは

プロジェクトが多くの外部ライブラリやパッケージに依存している場合、「依存性地獄(dependency hell)」と呼ばれる問題がありました。このような問題を解決するために考えられたのがセマンティックバージョニングです。

「依存性地獄(dependency hell)」の問題

ソフトウェアシステムが大きくなり、多くのパッケージを統合すると、依存関係の管理が困難になる問題です。

依存性地獄の2つの主な課題:

  1. バージョンロック:依存関係の指定が厳しすぎて、パッケージのアップグレードが困難になる状態。
  2. バージョン乱用:依存関係の指定が緩すぎて、将来のバージョンとの互換性を過度に仮定してしまう状態。

このような課題を解決するために、バージョン番号の割り当てとインクリメントに関する簡単なルールを決めたのが、セマンティックバージョニングと呼ばれるものです。

セマンティックバージョニングの基本原則

バージョン番号は

  1. メジャーバージョン
  2. マイナーバージョン
  3. パッチバージョン

の3つの部分に分かれおり、X.Y.Z(Major.Minor.Patch)のようにピリオドで区切られています。

メジャーバージョン: 1.x.x

後方互換性のない変更が導入された場合にインクリメントされます。 メジャーバージョンが上がると、既存のコードが動作しなくなる可能性があるので注意が必要です。

例: APIの大幅な変更、既存機能の削除、アプリケーションのアーキテクチャの変更など。

マイナーバージョン: x.1.x

後方互換性を保ちつつ、新機能が追加された場合にインクリメントされます。 マイナーバージョンが上がっても、既存のコードは通常影響を受けません。

例: 新しいメソッドの追加、オプションのパラメータの追加、既存機能の拡張など。

パッチバージョン: x.x.1

バグ修正や小さな改善が行われた場合にインクリメントされます。 パッチバージョンの変更は、既存のコードに影響を与えません。

例:セキュリティ修正、パフォーマンス改善、タイポの修正など。

さいごに

今回はpubspec.yamlでのバージョン指定方法とセマンティックバージョニングについて紹介しました。キャレット構文やセマンティックバージョニングを適切に理解して開発に取り組もうと思います。

参考文献

Package dependencies | Dart
Package versioning | Dart
Upgrading | Flutter
[Flutter] pubspec.yaml の文法/チートシート #Dart - Qiita
セマンティックバージョンについて