こんにちは、教育系エンジニアのひらまつ(@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下で指定されたバージョンになる。
という理解で良さそう。