去年のAdvent calendarで@sh4869 さんに紹介していただいたsource_genですが、
一年間で微妙に使い方が変わったようなので再度まとめます。
準備
必要なLibraryは
- build_runner
- source_gen
です
pubspec.yaml
name: source_gen_example
description: A starting point for Dart libraries or applications.
version: 0.0.1
environment:
sdk: '>=1.0.0 <2.0.0'
dev_dependencies:
test: '>=0.12.0 <0.13.0'
build_runner: ^0.1.0
source_gen:
定義の仕方
JSONの型を定義したClassを作成します。
lib/language.dart
library language;
import 'package:source_gen/generators/json_serializable.dart';
@JsonSerializable()
class Language {
final String name;
final bool staticType;
final int indent;
Language(this.name,this.staticType,this.indent);
}
build
buildの定義です。詳しく知らないですがGulpのTaskのようなものだと思います。
bin/build.dart
import 'package:source_gen/generators/json_serializable_generator.dart' as json;
import 'package:source_gen/source_gen.dart';
import 'package:build_runner/build_runner.dart';
main() async {
await build(phases, deleteFilesByDefault: true);
}
const library_name = "source_gen_example"; // pubspec.yamlで定義したライブラリ名です。
const file_path = "lib/*.dart"; // ディレクトリ名です。
final PhaseGroup phases = new PhaseGroup.singleAction(
new GeneratorBuilder(const [
const json.JsonSerializableGenerator(),
]),
new InputSet(library_name, const [file_path]));
実行
コマンドプロンプトから上記build.dartを実行するとlib/language.g.dartが生成されます。
dart bin\build.dart
Classの修正
型を定義したClassが自動生成した処理を読み出せるように修正します。
するべきことは三点です。
- 自動生成したFileをpart 文で読み出し
- ミックスインの設定
- ファクトリコンストラクタの追加
lib/language.dart
library language;
import 'package:source_gen/generators/json_serializable.dart';
part 'language.g.dart'; // 自動生成したファイルを読み込み
@JsonSerializable()
class Language extends Object with _$LanguageSerializerMixin { // ミックスインの設定
final String name;
final bool staticType;
final int indent;
Language(this.name,this.staticType,this.indent);
factory Language.fromJSON(Map map) => _$LanguageFromJson(map); // ファクトリコンストラクタの追加
}
以上です。