3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

DartAdvent Calendar 2016

Day 14

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

Posted at

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

}

以上です。

3
0
0

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
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?