Processo di Generazione
Pipeline di Generazione
Quando esegui goa gen, Goa segue un processo sistematico per trasformare il tuo
design in codice funzionante:
1. Fase di Bootstrap
Goa prima crea ed esegue un programma temporaneo:
Durante questa fase, Goa crea un programma temporaneo main.go che:
- Importa i pacchetti Goa necessari per la generazione e valutazione del codice
- Importa il tuo pacchetto di design
- Esegue la valutazione DSL per elaborare il tuo design
- Attiva il processo di generazione del codice
Questo programma temporaneo serve come punto di ingresso per trasformare il tuo design in codice. Viene creato e rimosso automaticamente durante il processo di generazione, quindi non hai mai bisogno di gestirlo direttamente.
2. Valutazione del Design
Durante questa fase, Goa carica e valuta il tuo pacchetto di design:
- Le funzioni DSL vengono eseguite per creare oggetti espressione che rappresentano il design della tua API
- Queste espressioni vengono combinate in un modello completo della struttura e del comportamento della tua API
- Il sistema analizza e stabilisce relazioni tra le diverse espressioni
- Tutte le regole e i vincoli del design vengono attentamente validati per garantire la correttezza
Questa fase di valutazione è critica poiché trasforma il tuo design dichiarativo in un modello strutturato che può essere utilizzato per la generazione del codice.
3. Generazione del Codice
Una volta che le espressioni sono state validate, vengono passate ai generatori di
codice di Goa. I generatori utilizzano queste espressioni come dati di input per renderizzare vari
template di codice. Generano codice specifico per il trasporto HTTP e gRPC, creano
tutti i file di supporto necessari e scrivono l’output completo nella directory gen/.
Questo passaggio di generazione produce tutto il codice necessario per eseguire il tuo servizio
mantenendo la coerenza in tutto il codebase.
Struttura Generata
Una tipica struttura di progetto generata:
myservice/
├── cmd/ # Comandi di esempio generati
│ └── calc/
│ ├── grpc.go
│ └── http.go
├── design/ # I tuoi file di design
│ └── design.go
├── gen/ # Codice generato
│ ├── calc/ # Codice specifico del servizio
│ │ ├── client/
│ │ ├── endpoints/
│ │ └── service/
│ └── http/ # Livello di trasporto
│ ├── client/
│ └── server/
└── myservice.go # Stub di implementazione del servizio generato
Consulta la sezione Codice Generato per maggiori dettagli sul codice generato.