【Flutter】build_runnerを利用してpubspec.yamlを読み込んでパースする方法
こんにちは、株式会社Pentagonでアプリ開発をしている石渡港です。
今回はbuild_runnerを利用してpubspec.yamlを読み込んでパースする方法についてまとめました。
その結果、1つのプロジェクトで管理することが難しいことがわかりました。
【この記事を読むメリット】
buildとfreezedと組み合わせて利用する方法を理解できる
【こんな方に参考にしていただきたい】
- 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_core と hoge_package_runner はPackage化することで、それぞれの役割を分割しています。
hoge_package_core でパース処理やコード生成を行ってfreezedを実行してhoge_package_core をhoge_package_runner から呼び出すようにします。hoge_package_runner をbuild_runnerから呼び出して解決できます。
まとめ
パース処理やコード生成、build実行部を1つのプロジェクトにまとめたほうが管理は楽ですが、build_runnerの特性上の問題が発生することがわかりました。 2つに分けることでbuild_runnerの特性を逃がすことができたため、freezedを利用して自作コード生成を作成できることがわかりました。