Att anta att du har läst mitt inlägg Starting a Go Project borde du ha utgångspunkten för en minimal go-webbtjänst. För ditt första projekt är det lättare att hålla all din kod i en mapp, i basen av ditt projekt, men vid någon tidpunkt kommer du att vilja omstrukturera saker och ting, detta görs av ett par anledningar:
- Att ha allt i en mapp resulterar i en massa interdependenser i koden.
- Det kan vara svårt att återanvända utanför projektet eftersom koden bara är utformad för att användas i ett paket.
- Det är omöjligt att ha mer än en binär fil, eftersom man bara kan ha en
main
metod.
Detta inlägg kommer att ge en översikt över den struktur jag följer i mina Go-projekt när jag bygger webbtjänster.
Notera: Om du bara bygger ett bibliotek för att använda i dina tjänster, eller dela med andra, är det okej att lägga allt i basmappen i ditt projekt, ett exempel på detta är mitt dynastore-bibliotek.
/cmd
Denna mapp innehåller de viktigaste filerna för projektets ingångspunkt i applikationen, där katalognamnet matchar namnet för binärfilen. Så till exempel cmd/simple-service
innebär att den binärfil som vi publicerar kommer att vara simple-service
.
/internal
Detta paket innehåller den privata bibliotekskoden som används i din tjänst, den är specifik för tjänstens funktion och delas inte med andra tjänster. En sak att notera är att denna sekretess upprätthålls av kompilatorn själv, se Go 1.4 release notes för mer information.
/pkg
Denna mapp innehåller kod som är okej för andra tjänster att konsumera, detta kan inkludera API-klienter eller hjälpfunktioner som kan vara användbara för andra projekt men som inte motiverar ett eget projekt. Personligen föredrar jag att använda detta framför internal
, främst eftersom jag gillar att hålla saker öppna för återanvändning i de flesta projekt.
Projektstruktur
När du bygger upp ditt projekt finns det några mycket viktiga mål du bör tänka på när det gäller hur du strukturerar dina paket:
- Håller saker och ting konsekventa
- Håller saker och ting så enkla som möjligt, men inte enklare
- Koppla ihop delar av tjänsten eller applikationen
- Syftar till att se till att det är lätt att navigera runt
Totalt sett när du kommer igång bör du experimentera lite, pröva några olika idéer när du bygger upp ditt första paket och få lite feedback baserat på ovanstående mål.
Det främsta målet är att du bygger lätt att underhålla, konsekvent och pålitlig programvara.
Exempel
Jag rekommenderar att du tar en titt på exitus för att se hur jag strukturerar mina projekt, det mesta av koden ligger under mappen pkg
med varje undermapp som har en eller flera filer. Från den översta nivån är det ganska tydligt vad varje paket relaterar till, och även om den är mager på tester har den några exempel.
$ 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_kundprojekt.ner.sql│ ├─ 20190723044115_kundprojekt.upp.sql│ ├─ 20190726175158_frågor.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│ │ ├── transaktioner.go│ 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.go│ ├─ issues.go│ ├─ issues_test.go│ ├─ migrate_test.go│ ├─ projects.go│ ├─ projects_test.go│ └─ store.go└─── README.md
Syftet här är att illustrera hur du kan utveckla ditt projekt från ett par filer till en större webbtjänst. Jag uppmuntrar dig att gå igenom github-projekt och ta reda på hur andra utvecklare har strukturerat sina projekt, och framför allt att prova det själv!
- GopherCon EU 2018: Peter Bourgon – Bästa metoder för industriell programmering
- Standardlayout för Go-projekt
- GopherCon 2018: Cat Seeing – Hur strukturerar du dina Go Apps
Feedback
Följ gärna med att kontakta oss via:
- @ mig på Twitter
- Sänd mig ett e-postmeddelande
- Starta ett Go-projekt
- Bygga en WLToys A979 åsnebil
- Kommer du igång med Cognito?
- Varför CDK?
- Serverlösa bakgrundsjobb del 2