Assumendo che abbiate letto il mio post Starting a Go Project dovreste avere il punto di partenza per un servizio web Go minimo. Per il tuo primo progetto è più facile tenere tutto il tuo codice in una cartella, nella base del tuo progetto, ma ad un certo punto vorrai ristrutturare le cose, questo viene fatto per alcune ragioni:

  • Avere tutto in una cartella comporta un sacco di interdipendenze nel codice.
  • Riutilizzare al di fuori del progetto può essere difficile, poiché il codice è progettato per essere usato solo in un pacchetto.
  • È impossibile avere più di un binario, poiché si può avere solo un metodo main.

Questo post fornirà una panoramica della struttura che seguo nei miei progetti Go quando costruisco servizi web.

Nota: Se stai solo costruendo una libreria da usare nei tuoi servizi, o da condividere con altri, va bene mettere tutto nella cartella base del tuo progetto, un esempio di questo è la mia libreria dynastore.

/cmd

Questa cartella contiene i principali file del punto di ingresso dell’applicazione per il progetto, con il nome della directory corrispondente al nome del binario. Così per esempio cmd/simple-service significa che il binario che pubblichiamo sarà simple-service.

/internal

Questo pacchetto contiene il codice privato della libreria usato nel tuo servizio, è specifico per la funzione del servizio e non è condiviso con altri servizi. Una cosa da notare è che questa privacy è applicata dal compilatore stesso, vedi le note di rilascio di Go 1.4 per maggiori dettagli.

/pkg

Questa cartella contiene codice che può essere utilizzato da altri servizi, questo può includere client API, o funzioni di utilità che possono essere utili per altri progetti ma non giustificano un progetto proprio. Personalmente preferisco usare questo rispetto a internal, principalmente perché mi piace tenere le cose aperte per il riutilizzo nella maggior parte dei progetti.

Struttura del progetto

Come costruisci il tuo progetto ci sono alcuni obiettivi molto importanti che dovresti considerare quando si tratta di come strutturi i tuoi pacchetti:

  • Mantenere le cose coerenti
  • Mantenere le cose il più semplici possibile, ma non più semplici
  • Accoppiare liberamente le sezioni del servizio o dell’applicazione
  • Fare in modo che sia facile orientarsi

In generale quando si inizia si dovrebbe sperimentare un po’, provare alcune idee diverse quando si costruisce il primo e ottenere alcuni feedback sulla base degli obiettivi di cui sopra.

L’obiettivo numero uno è quello di costruire un software facile da mantenere, coerente e affidabile.

Esempio

Consiglio di dare un’occhiata a exitus per vedere come strutturo i miei progetti, la maggior parte del codice è sotto la cartella pkg con ogni sotto cartella che ha uno o più file. Dal livello superiore è abbastanza chiaro a cosa si riferisce ogni pacchetto, e anche se magro sui test ha alcuni esempi.

$ tree exitus/ exitus/├── cmd│ ├── authtest│ │ └── main.go│ ├── backend│ │ └── main.go│ └─ client│ └─ main.go├─ dev│ ├─ add_migration.sh│ └─ docker-compose.yml├─ Dockerfile├─ go.mod├─ go.sum│ ├─ 20190721131113_extensions.down.sql│ ├─ 20190721131113_extensions.up.sql│ ├─ 20190723044115_customer_projects.down.sql│ ├─ 20190723044115_customer_projects.up.sql│ ├─ 20190726175158_issues.down.sql│ ├── 20190726175158_issues.up.sql│ ├─ 20190726201649_comments.down.sql│ ├─ 20190726201649_comments.up.sql│ ├─ bindata.go│ ├── migrations_test.go│ └─ README.md├── pkg│ ├─ api│ │ ├─ exitus.gen.go│ │ ├─ exitus.yml│ └─ gen.go│ ├── auth│ │ ├─ scopes.go│ └─ user.go│ ├─ conf│ │ ├─ conf.go│ │ └─ conf_test.go│ ├── db│ │ ├─ db.go│ │ ├─ dbtesting.go│ │ ├── migrate.go│ │ ├── sqlhooks.go│ │ └─ transaction.go│ ├── env│ │ └── env.go│ ├─ healthz│ │ ├─ healthz.go│ │ └── healthz_test.go│ ├── jwt│ │ └── jwt.go│ ├── metrics│ │ └── metrics.go│ ├── middleware│ │ └── middleware.go│ ├─ oidc│ │ └── client.go│ ├── server│ ├─ reflect.go│ └─ server.go│ └─ store│ ├── comments.go│ ├── comments_test.go│ ├─ customers.go│ ├─ customers_test.├─ issues.go│ ├─ issues_test.go│ ├─ migrate_test.go│ ├─ projects.go│ ├─ projects_test.go│ └─ store.go└── README.md

Lo scopo qui è di illustrare come si fa crescere il progetto da un paio di file, a un servizio web più grande. Ti incoraggio a tracciare i progetti github e a scavare in come altri sviluppatori hanno strutturato i loro, e soprattutto a provarlo tu stesso!

  • GopherCon EU 2018: Peter Bourgon – Best Practices per la programmazione industriale
  • Standard Go Project Layout
  • GopherCon 2018: Cat Seeing – How Do You Structure Your Go Apps

Feedback

Sentitevi liberi di contattare via:

  • @ me su Twitter
  • Mandami una Email
  • Iniziare un progetto Go
  • Costruire una macchina asino WLToys A979
  • Iniziare con Cognito?
  • Perché CDK?
  • Lavori in background senza server parte 2

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.