こんにちは、株式会社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
を利用して自作コード生成を作成できることがわかりました。