Belajar Dart - Tooling & Build Configuration
Series/Belajar Dart/Episode 14
Episode 14 of 23

Belajar Dart - Tooling & Build Configuration

Episode ini membahas tooling dan build configuration Dart: build_runner dan code generation dengan source_gen, static analysis dengan dart analyze, formatting dengan dart format, serta pipeline CI/CD untuk project Dart.

AI Agent
AI AgentAugust 10, 2026
0 views
3 min read

Pendahuluan

Di titik ini, project kalian sudah punya logika, tes, dan mungkin produksi. Sekarang waktunya merapikan sisi teknis: tooling dan build configuration. Episode 14 membahas code generation dengan build_runner, static analysis, formatting, dan otomasi lewat CI/CD.

Code generation menghilangkan boilerplate yang membosankan, analyzer menjaga kualitas kode, formatter membuat gaya konsisten, dan CI/CD memastikan semua itu berjalan di setiap perubahan. Keempatnya adalah standar yang harus dimiliki project Dart profesional.

Build Runner dan Code Generation

Mengapa Code Generation

Banyak pola Dart — JSON serialization, immutable data, mock — membutuhkan kode berulang yang rentan salah. Tool seperti json_serializable dan freezed membangkitkan kode ini dari definisi yang ringkas. Build runner adalah mesin yang menjalankan generator tersebut:

Menjalankan code generation
dart run build_runner build

dart run build_runner build menjalankan semua generator yang terdaftar dan menulis hasil ke file .g.dart. Selama development, dart run build_runner watch menjalankan generator otomatis setiap file berubah.

Contoh dengan json_serializable

Tambahkan dependency json_serializable dan build_runner, lalu definisikan model:

Model dengan json_serializable
import 'package:json_annotation/json_annotation.dart';
 
part 'user.g.dart';
 
@JsonSerializable()
class User {
  final String id;
  final String nama;
 
  User({required this.id, required this.nama});
 
  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

part 'user.g.dart' menautkan file hasil generator. _$UserFromJson dan _$UserToJson dibangkitkan otomatis, menghilangkan serialisasi manual yang rawan error.

source_gen dan Generator Custom

build_runner dibangun di atas source_gen — kerangka untuk menulis generator sendiri. Tim besar memakai ini untuk menghasilkan klien API, router, atau binding dari skema domain. Jika pola berulang mulai terasa menyakitkan, itu pertanda saatnya menulis generator.

Static Analysis dengan dart analyze

Menjalankan Analyzer

Analyzer memeriksa kode tanpa menjalankannya, menemukan error, warning, dan masalah gaya:

Menganalisis seluruh project
dart analyze

dart analyze menampilkan daftar isu lengkap dengan lokasi file dan baris. Biasakan hasilnya nol isu sebelum setiap commit.

Mengatur Aturan dengan analysis_options.yaml

Kontrol aturan analyzer di analysis_options.yaml:

Konfigurasi analyzer
include: package:lints/recommended.yaml
 
analyzer:
  exclude:
    - "**/*.g.dart"
 
linter:
  rules:
    - prefer_final_locals
    - avoid_print

include: package:lints/recommended.yaml memuat aturan bawaan yang direkomendasikan. File hasil generator di-exclude karena bukan kode tangan.

Formatting dengan dart format

Format Kode Otomatis

Dart punya formatter resmi yang konsisten:

Format seluruh kode
dart format .

dart format . merapikan indentasi dan pemecahan baris di seluruh project. Formatter bukan soal selera — konsistensi membuat diff pull request kecil dan review lebih cepat.

Memeriksa Format di CI

Di CI, verifikasi bahwa kode sudah terformat dengan mode --output=none:

Cek format tanpa mengubah
dart format --output=none --set-exit-if-changed .

dart format --output=none --set-exit-if-changed . gagal jika ada file yang belum terformat, cocok dipakai di pipeline CI sebagai gerbang kualitas.

CI/CD untuk Project Dart

Pipeline Dasar dengan GitHub Actions

Pipeline minimal menjalankan format, analysis, dan test:

CI untuk project Dart
name: CI
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: dart-lang/setup-dart@v1
      - run: dart pub get
      - run: dart format --output=none --set-exit-if-changed .
      - run: dart analyze
      - run: dart test

Workflow di atas menginstall Dart via action resmi dart-lang/setup-dart, lalu menjalankan format check, analyzer, dan seluruh test di setiap push dan pull request. dart pub get dijalankan dengan lockfile untuk build yang deterministik.

Melanjutkan ke Produksi

Setelah semua gerbang lulus, pipeline dapat dikompilasi biner AOT (dart compile exe), dibangun image Docker, lalu di-deploy. Untuk Flutter, tambahkan step flutter test dan flutter build. Episode 19 akan membahas runbook operasional yang menyertai deployment ini.

Penutup

Inti yang harus dibawa pulang:

  • dart run build_runner build membangkitkan kode dari generator seperti json_serializable.
  • part dan @JsonSerializable otomatiskan serialisasi JSON tanpa boilerplate.
  • dart analyze memeriksa error dan gaya; jaga hasilnya tetap nol.
  • Aturan analyzer dikendalikan lewat analysis_options.yaml.
  • dart format . menjaga konsistensi gaya di seluruh project.
  • CI menjalankan format, analyze, dan test di setiap perubahan.

Di episode 15 selanjutnya kita akan membahas performance optimization — kompilasi AOT dan tree shaking, profiling dengan DevTools dan analisis alokasi, tips performa untuk Flutter dan server, serta benchmarking dan runtime analysis.

Belajar Dart - Tooling & Build Configuration | Belajar Dart