【Flutter】build_runnerを利用してpubspec.yamlを読み込んでパースする方法

こんにちは、株式会社Pentagonでアプリ開発をしている石渡港です。

今回はbuild_runnerを利用してpubspec.yamlを読み込んでパースする方法についてまとめました。

その結果、1つのプロジェクトで管理することが難しいことがわかりました。

【この記事を読むメリット】

  • buildfreezed と組み合わせて利用する方法を理解できる

【こんな方に参考にしていただきたい】

  • Flutterでコード生成を行うPackageを作成したい人

【調査の動機】

弊社でFlutterでコード生成を行うPackageを作成した際に、苦戦したので記録に残しました。

【調査結果】

  • 調査した結果、Flutterでコード生成を行う際に、pubspec.yamlをパース・コード生成を行う処理とbuild_runnerを実行する部分を分けて作成する必要がありました
目次

【結論】

今回は、パースとコード生成処理を行った際に起きた問題、解決に向けた構成についての2点にまとめます。

コード生成についてはこちらを参考にしてください

パースとコード生成処理とbuild_runnerを実行する部分一緒に実装した際に起きた問題

build用のクラスを作成してbuild.yamlを設定とfreezedクラスを作成すると、buildのコード生成が先に走ります。結果、freezedのコード生成が先に行われずにビルドエラーが発生するためにうまく実行できない問題が発生しました。

そこで、FlutterGenを参考に次の項で説明する構成を変更することで解決できました。

解決に向けた構成について

hoge_package 
┣ example パッケージの利用例を示すプロジェクト Project
┗ packages 
  ┣ hoge_package_core こちらにパース処理・コード生成を記載 Package
  ┗ hoge_package_runner こちらにビルド実行を記載 Package

- hoge_package_corehoge_package_runner はPackage化することで、それぞれの役割を分割しています。

hoge_package_core でパース処理やコード生成を行ってfreezedを実行してhoge_package_corehoge_package_runner から呼び出すようにします。hoge_package_runnerbuild_runnerから呼び出して解決できます。

まとめ

パース処理やコード生成、build実行部を1つのプロジェクトにまとめたほうが管理は楽ですが、build_runnerの特性上の問題が発生することがわかりました。
2つに分けることでbuild_runnerの特性を逃がすことができたため、freezedを利用して自作コード生成を作成できることがわかりました。

採用情報はこちら
目次