search
LoginSignup
0

More than 5 years have passed since last update.

posted at

<2016/12版>source_genの最小限の使い方

去年の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); // ファクトリコンストラクタの追加

}

以上です。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0