😃

Flutterのパッケージを一時的に書き換える方法

2024/11/02に公開

ある日、開発で使っているFlutterのパッケージにバグが見つかりました。パッケージのGitHubを見に行くと、既にIssueとそれに対するPullRequestが出ています。しかし、その修正内容はまだリリースバージョンに反映されていませんでした。
結構致命的なバグだったのもあり、自分のアプリ上ではすぐに直したかったので、修正版がリリースされるまではローカルのパッケージを書き換えて凌ぐことにしました。この記事では、その方法をお教えします。

結論:pubspec.yamldependency_overridesを使うと良い
ダメだった方法:dependencyを直接書き換える

手順

修正を反映させるために、以下の手順でdependency_overridesを使用してローカルの修正版パッケージをFlutterプロジェクトに適用します。

パッケージのコピー

修正対象のパッケージを.pub-cacheフォルダ(通常、~/.pub-cacheもしくはC:\Users\[ユーザー名]\.pub-cache)から取得し、Flutterプロジェクト内の適当なフォルダを作成し、(例えばpluginsなど)その中にコピーします。

pubspec.yamlにdependency_overridesを追記

次に、Flutterプロジェクトのpubspec.yamldependency_overridesセクションを追加し、上書きしたいパッケージの名前とローカルフォルダのパスを指定します。例えば、修正したいパッケージがsample_packageで、ローカルにコピーしたパスが./plugins/sample_packageであれば、以下のように記述します。

dependency_overrides:
  sample_package:
    path: ./plugins/sample_package

dependency_overridesに関する公式ドキュメントはこちら
https://dart.dev/tools/pub/dependencies#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