pubspec.yamlの「dependency_overrides」とは何か?【Dart・Flutter】

Flutter

こんにちは、教育系エンジニアのひらまつ(@hiramatsuu)です。

ひらまつの簡単な自己紹介

書籍「ゼロからわかる Linuxコマンド200本ノック(技術評論社)」の著者。Udemy受講者8万人。
プログラミング教育をメインに活動するエンジニアとして、動画教材の作成・技術書の執筆・学習アプリの開発などを行なっています(詳しくはこちら)。

本記事では、pubspec.yamlにおける「dependency_overrides」というフィールドについて解説します。

dependency overridesとは

dependency(依存モジュール)への参照を、一時的にoverride(上書き)するための機能

例えば、transmogrifyという架空のモジュールへの依存を、一時的に上書きすることで、バージョン3.2.1に依存するようにするには、以下のように書く。

name: my_app
dependencies:
  transmogrify: ^1.2.0
dependency_overrides:
  transmogrify: 3.2.1

このように書くと、dependencies下に書いている、モジュールのバージョン制約(transmogrify: ^1.2.0)を上書きして、一時的にdependency_overrides下に書いた、モジュールのバージョン(transmogrify: 3.2.1)に依存できるようになる。

上記の変更後に、dart pub getやdart pub upgradeを実行すると、その後、transmogrifyをimportした際には、dependency_overrides下に記載されたバージョンにアクセスするようになる。

dependency overridesの用途

あるバージョンのパッケージに、実験やテストなどの目的で、一時的に依存したい場合に使える

例えば、transmogrifyがpub.devに公開されている、かつ、あなたのローカルにおいて、最新バージョンの開発を行なっている、とする。

あなたは、transmogrifyの開発がうまくいっているかを検証したい。そのために、transmogrifyを使用しているパッケージにおいて、pub.devに公開されているtransmogrifyに依存している状態から、ローカルで開発中のtransmogrifyに、依存先を変更したいとする。

そのためには、以下のように指定する(開発中のものが相対パスで../transmogrify_patch/にある場合)。

name: my_app
dependencies:
  transmogrify: ^1.2.0
dependency_overrides:
  transmogrify:
    path: ../transmogrify_patch/ # ローカルのtransmogrifyに依存先を変更

こうすることで、直接的な依存か・間接的な依存かを問わず、transmogrifyパッケージに依存するパッケージは、ローカルのバージョンに依存するようになる。

また、dependency_overridesを使うことで、撤回されたバージョン(retracted version)のパッケージを使うことも可能1

dependency overridesの注意点

もちろん、パッケージがサポートしている範囲外のバージョンに依存するようにオーバーライドしたり、予想外の振る舞いを持つローカルのバージョンに依存した場合、アプリを破壊する場合があるため、利用時には注意が必要。

また、dependency overridesの設定は、pubspec.yamlに記載があるパッケージにおいてしか考慮されない。つまり、パッケージAがパッケージBに依存している場合、パッケージBのpubspec.yamlに書かれているdependency overridesは、パッケージAには影響しない。言い換えれば、pub.devに公開されているパッケージに、dependency overridesが使われていたとしても、ユーザーには影響がない

dart[flutter] pub add コマンドを使う方法

pubspec.yamlを直接編集せずに、dart[flutter] pub addを使って、dependency_overridesを追加する方法もある。2

例えば、依存しているfooモジュールのバージョンを、1.0.0に上書きしたい場合には、次のように実行する。

$ dart pub add override:foo:1.0.0

このように実行すると、pubspec.yamlには次のように追加される。

dependency_overrides:
  foo: 1.0.0

大雑把なまとめ

dependency_overridesフィールドを変更した上で、dart pub getやdart pub upgradeを実行すると、

lockfileに記載されるバージョンが、一時的にdependency_overrides下で指定されたバージョンになる。

という理解で良さそう。

参考文献

Package dependencies
Add other packages to your app. Specify package locations, version constraints, and more.

脚注

  1. 詳しくはhttps://dart.dev/tools/pub/publishing#how-to-use-a-retracted-version-of-a-packageを参照。 ↩︎
  2. https://dart.dev/tools/pub/cmd/pub-add#dependency-override ↩︎
タイトルとURLをコピーしました