Quando un'app Flutter cresce, il classico progetto monolitico con una cartella lib/ piena di feature diventa ingestibile: i tempi di analisi si allungano, i confini tra moduli evaporano e ogni refactoring rischia di toccare tutto.
La risposta più solida è il monorepo: un unico repository che contiene l'app (o più app) e una serie di package interni versionati e testabili in modo indipendente. Melos è lo strumento standard dell'ecosistema Dart/Flutter per orchestrare questo scenario: collega i package tra loro, esegue comandi in parallelo su tutto il workspace, gestisce versioning e changelog basati sui conventional commit.
In questo tutorial avanzato costruiremo da zero un monorepo realistico con questa struttura:
acme/
├── melos.yaml
├── pubspec.yaml # workspace root
├── apps/
│ └── mobile/ # app Flutter
├── packages/
│ ├── core/ # modelli, networking, utility (Dart puro)
│ ├── design_system/ # widget e tema condivisi (Flutter)
│ ├── feature_auth/
│ └── feature_catalog/
└── tool/
└── check_boundaries.dart
Vedremo anche come rendere i confini architetturali eseguibili: non basta scriverli in un documento, devono fallire in CI quando qualcuno li viola.
Prerequisiti: Flutter 3.27+ / Dart 3.6+ (per i pub workspaces), dimestichezza con
pubspec.yaml, CLI e GitHub Actions.