Flutterのパッケージを一時的に書き換える方法
ある日、開発で使っているFlutterのパッケージにバグが見つかりました。パッケージのGitHubを見に行くと、既にIssueとそれに対するPullRequestが出ています。しかし、その修正内容はまだリリースバージョンに反映されていませんでした。
結構致命的なバグだったのもあり、自分のアプリ上ではすぐに直したかったので、修正版がリリースされるまではローカルのパッケージを書き換えて凌ぐことにしました。この記事では、その方法をお教えします。
結論:pubspec.yaml
のdependency_overrides
を使うと良い
ダメだった方法:dependency
を直接書き換える
手順
修正を反映させるために、以下の手順でdependency_overridesを使用してローカルの修正版パッケージをFlutterプロジェクトに適用します。
パッケージのコピー
修正対象のパッケージを.pub-cache
フォルダ(通常、~/.pub-cache
もしくはC:\Users\[ユーザー名]\.pub-cache
)から取得し、Flutterプロジェクト内の適当なフォルダを作成し、(例えばplugins
など)その中にコピーします。
pubspec.yamlにdependency_overridesを追記
次に、Flutterプロジェクトのpubspec.yaml
にdependency_overrides
セクションを追加し、上書きしたいパッケージの名前とローカルフォルダのパスを指定します。例えば、修正したいパッケージがsample_package
で、ローカルにコピーしたパスが./plugins/sample_package
であれば、以下のように記述します。
dependency_overrides:
sample_package:
path: ./plugins/sample_package
dependency_overrides
に関する公式ドキュメントはこちら
flutter pub getを実行
最後に、flutter pub getコマンドを実行してパッケージの依存関係を再構築します。これにより、Flutterプロジェクトはsample_packageの修正版をローカルから参照するようになり、修正が適用されます。
ダメだった方法とその理由
最初に試した方法は、パッケージのdependenciesセクションで修正版のパッケージを直接指定するものでした。
dependency:
#sample_package: ^1.0.0
sample_package:
path: ./plugins/sample_package
しかし、これでは依存関係の解決がうまくいかず失敗しました。パッケージのバージョン情報が欠落してしまい、他のパッケージが依存するパッケージのバージョンと一致せず、依存関係の競合が発生しました。
dependency_overridesを使うと、バージョン情報を保ったまま、依存パッケージの内容だけを上書きすることが可能になります。そのため、特定のパッケージだけを修正版で差し替えたい場合には、dependency_overridesが有効です。
終わり
Discussion