4
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

posted at

updated at

Dart の BuildRunner を使ってみよう その1

何回かに分けて、 Dart の BuildRunner を、見ていきます。

BuidRunnerを使う事によって、ビルド時にアレコレ操作できるようになります。

例えば、Vue.dartなどの、アノテーションを利用した言語の拡張
https://github.com/kirbyfan64/vuedart

@VueComponent(template: '<p>{{uppercaseName}}</p>')
class ShowName extends VueComponentBase {
  ShowName(context): super(context);

  @prop
  String name;

  @computed
  String get uppercaseName => name.toUpperCase();
}

例えば、sass_builder のように、 scss から css を生成したり
https://github.com/dart-league/sass_builder.git


そう行った事ができるようになります。

はじめに

Dart Advent 2018 の 1日目の記事です。

1日目ということで、 最初に実行するのは、Dart関連のコマンドはビルドかなと
思い、「Dartのビルドシステム について解説」をする事にしました。

まぁ、 よーく考えたら、pub コマンドだったかな..
とも、思いましたが

解説する事

build_runner について解説します。
https://github.com/dart-lang/build

しかし、 annotation など、少し複雑な事をしようとすると、
build package だけを理解しても難しいです。

package:analyzer
package:source_span
package:source_maps

といった、ものの理解も必要です。

これらについて解説していきます。

1回目 は、 package:build の使い方

1回目では、 build runner 向けのコードを書いて、走らせるまでを、
紹介していきます。

build_runnerが走ると、変換処理が走ります。

  • 変換対象のファイルを指定する
  • 変換対象のファイルを呼び出して、アレコレ処理する

この2つを実際に試してみます。

lib/builder.dart
import 'package:build/build.dart';
import 'dart:async';

Builder helloBuilder(BuilderOptions options) {
  return new HelloBuilder();
}

class HelloBuilder implements Builder {
  // 変換する
  // 今回は、ログ表示するだけ
  FutureOr<void> build(BuildStep buildStep) async {
    print(">> ${buildStep.inputId}");
  }

  // 対象のファイルを指定する
  Map<String, List<String>> get buildExtensions {
    return {".dart": const [".g.dart"]};
  }
}

こんな感じで書けます。

また、 Builder の Factory がある場所を指定してあげます。

build.yaml
builders:
  helloBuilder:
    import: "package:hello/builder.dart"
    builder_factories: ["helloBuilder"]
    build_extensions: {".dart": [".g.dart"]}
    build_to: source
    auto_apply: root_package

で、完成。
実際に使ってみましょう。

pubspec.yaml の dependecies に 作成した物を追加して

dev_dependencies:
  hello:
    path: ../hello
  build_runner: any

以下のコマンドを叩くと、 ビルド対象の xxx.dart といったコードを一覧表示してくれます。

pub run build_runner clean
pub run build_runner build

終わり。

次回

package:analyzer について解説します。
その5くらいで、 annotation を利用して、アレコレできるようになる予定です。

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
4
Help us understand the problem. What are the problem?