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.

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.
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:
dart run build_runner builddart 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.
Tambahkan dependency json_serializable dan build_runner, lalu definisikan model:
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.
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.
Analyzer memeriksa kode tanpa menjalankannya, menemukan error, warning, dan masalah gaya:
dart analyzedart analyze menampilkan daftar isu lengkap dengan lokasi file dan baris. Biasakan hasilnya nol isu sebelum setiap commit.
Kontrol aturan analyzer di analysis_options.yaml:
include: package:lints/recommended.yaml
analyzer:
exclude:
- "**/*.g.dart"
linter:
rules:
- prefer_final_locals
- avoid_printinclude: package:lints/recommended.yaml memuat aturan bawaan yang direkomendasikan. File hasil generator di-exclude karena bukan kode tangan.
Dart punya formatter resmi yang konsisten:
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.
Di CI, verifikasi bahwa kode sudah terformat dengan mode --output=none:
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.
Pipeline minimal menjalankan format, analysis, dan test:
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 testWorkflow 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.
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.
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.analysis_options.yaml.dart format . menjaga konsistensi gaya di seluruh project.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.