golang-standarder/prosjekt-layout
Oversettelser:
- 한국어 문서
- 简体中文
- 正體中文
- 正體中文
- ??
- Franç
- 日本語
- portugisisk
- Españ
- oversikt
- go kataloger
- /cmd
- / intern
- /pkg
- /leverandør
- Tjenesteprogramkataloger
- / api
- Webapplikasjonskataloger
- / web
- Vanlige Programkataloger
- /configs
- /init
- /scripts
- /build
- /distribusjoner
- /test
- Andre Kataloger
- / docs
- /verktøy
- / eksempler
- /third_party
- /githooks
- / eiendeler
- / website
- Kataloger Du Ikke burde ha
- /src
- Merker
- Notater
oversikt
dette er et grunnleggende oppsett for go-applikasjonsprosjekter. Det er ikke en offisiell standard definert av core Go dev-teamet; det er imidlertid et sett med vanlige historiske og nye prosjektoppsettmønstre i Go-økosystemet. Noen av disse mønstrene er mer populære enn andre. Det har også en rekke små forbedringer sammen med flere støtte kataloger felles for alle store nok virkelige verden søknad.
hvis Du prøver Å lære Go, eller hvis du bygger Et PoC eller et leketøysprosjekt for deg selv, er dette prosjektoppsettet en overkill. Start med noe veldig enkelt (en enkelt main.go
fil er mer enn nok). Som prosjektet vokser husk at det vil være viktig å sørge for at koden er godt strukturert ellers vil du ende opp med en rotete kode med mange skjulte avhengigheter og global tilstand. Når du har flere personer som jobber med prosjektet, trenger du enda mer struktur. Det er da det er viktig å introdusere en vanlig måte å administrere pakker / biblioteker på. Når du har et åpen kildekode-prosjekt eller når du vet at andre prosjekter importerer koden fra prosjektdatabasen din, er det da viktig å ha private (aka internal
) pakker og kode. Klone depotet, beholde det du trenger og slette alt annet! Bare fordi det er der, betyr det ikke at du må bruke alt. Ingen av disse mønstrene brukes i hvert enkelt prosjekt. Selvvendor
mønsteret er ikke universelt.
Med Go 1.14 Go Modules
er endelig klar for produksjon. Bruk Go Modules
med mindre du har en bestemt grunn til ikke å bruke dem, og hvis du gjør det, trenger du ikke å bekymre deg for $GOPATH og hvor du legger prosjektet ditt. Den grunnleggende go.mod
filen i repo antar at prosjektet ditt er vert På GitHub, men det er ikke et krav. Modulbanen kan være noe, selv om den første modulbanekomponenten skal ha en prikk i navnet (den nåværende versjonen Av Go håndhever ikke den lenger, men hvis du bruker litt eldre versjoner, ikke bli overrasket om byggene dine mislykkes uten det). Se Problemer 37554
og 32819
hvis du vil vite mer om det.
dette prosjektoppsettet er med vilje generisk, og det prøver ikke å pålegge en bestemt Go-pakkestruktur.
dette er en felles innsats. Åpne et problem hvis du ser et nytt mønster, eller hvis du tror at et av de eksisterende mønstrene må oppdateres.
hvis du trenger hjelp med navngivning, formatering og stil, start med å kjøre gofmt
og golint
. Sørg også for å lese Disse Gå kode stil retningslinjer og anbefalinger:
- https://talks.golang.org/2014/names.slidehttps://golang.org/doc/effective_go.html#nameshttps://blog.golang.org/package-names https://github.com/golang/go/wiki/CodeReviewComments
- stil retningslinje for go pakker (rakyll/jbd)
se Go Project Layout
for ytterligere bakgrunnsinformasjon.
Mer om å navngi og organisere pakker samt andre kodestrukturanbefalinger:
- GopherCon EU 2018: Peter Bourgon-Beste Praksis for Industriell Programmering
- GopherCon 2017: Edward Muller-Go Anti-Patterns
- GopherCon 2018: Kat Zien-Hvordan Strukturerer Du Dine Go Apps
Gophercon Russia 2018: Ashley McNamara + Brian Ketelsen-Beste praksis.
Et Kinesisk Innlegg om Pakkeorienterte designretningslinjer og Arkitekturlag
- 面向包的设计和架构分层
go kataloger
/cmd
hovedapplikasjoner for dette prosjektet.
katalognavnet for hvert program skal samsvare med navnet på den kjørbare filen du vil ha (f. eks. /cmd/myapp
).
ikke legg mye kode i programkatalogen. Hvis du tror at koden kan importeres og brukes i andre prosjekter, bør den leve i katalogen/pkg
. Hvis koden ikke er gjenbrukbar, eller hvis du ikke vil at andre skal bruke den, legg den koden i katalogen/internal
. Du vil bli overrasket over hva andre vil gjøre, så vær eksplisitt om dine intensjoner!
det er vanlig å ha en liten main
funksjon som importerer og påkaller koden fra /internal
og /pkg
kataloger og ingenting annet.
se katalogen/cmd
for eksempler.
/ intern
Privat søknad og bibliotekkode. Dette er koden du ikke vil at andre importerer i sine programmer eller biblioteker. Merk at dette layoutmønsteret håndheves av Selve Go-kompilatoren. Se Go 1.4release notes
for flere detaljer. Merk at du ikke er begrenset til toppnivåetinternal
katalog. Du kan ha mer enn eninternal
katalog på alle nivåer i prosjekttreet.
du kan eventuelt legge til litt ekstra struktur til de interne pakkene for å skille din delte og ikke-delte interne kode. Det er ikke nødvendig (spesielt for mindre prosjekter), men det er fint å ha visuelle ledetråder som viser den tiltenkte pakkebruken. Din faktiske programkode kan gå i/internal/app
katalogen (f.eks. /internal/app/myapp
) og koden som deles av disse appene i /internal/pkg
katalogen (f. eks. /internal/pkg/myprivlib
).
/pkg
Bibliotekskode som er ok å bruke av eksterne applikasjoner (f. eks.,/pkg/mypubliclib
). Andre prosjekter vil importere disse bibliotekene forventer at de skal fungere, så tenk to ganger før du setter noe her 🙂 Merk at katalogen internal
er en bedre måte å sikre at dine private pakker ikke kan importeres fordi Den håndheves Av Go. /pkg
katalogen er fortsatt en god måte å eksplisitt kommunisere at koden i den katalogen er trygt for bruk av andre. I'll take pkg over internal
blogginnlegg Av Travis Jeffery gir en god oversikt overpkg
oginternal
kataloger og når det kan være fornuftig å bruke dem.
Det er også en måte å gruppere Go-kode på ett sted når rotkatalogen inneholder mange ikke – Go – komponenter og kataloger som gjør det enklere å kjøre Ulike Go – verktøy (som nevnt i disse samtalene:Best Practices for Industrial Programming
Fra GopherCon EU 2018, GopherCon 2018: Kat Zien-Hvordan Strukturerer Du Go-Appene dine Og GoLab 2018-Massimiliano Pippi-prosjektoppsettmønstre I Go).
Se/pkg
katalogen hvis du vil se hvilke populære Go repos bruke dette prosjektet layout mønster. Dette er et vanlig layoutmønster, men det er ikke universelt akseptert, og noen I Go-fellesskapet anbefaler det ikke.
Det er ok å ikke bruke det hvis appprosjektet ditt er veldig lite og hvor et ekstra nivå av nesting ikke legger til mye verdi (med mindre du virkelig vil :-)). Tenk på det når det blir stort nok og rotkatalogen din blir ganske opptatt (spesielt hvis du har mange ikke-Go app-komponenter).
/leverandør
Programavhengigheter (administreres manuelt eller av ditt favorittbehandlingsverktøy for avhengighet som den nye innebygdeGo Modules
-funksjonen). Kommandoengo mod vendor
vil opprette/vendor
katalogen for deg. Merk at du kanskje må legge til-mod=vendor
flagget tilgo build
kommandoen hvis Du ikke bruker Go 1.14 der Den er på som standard.
ikke forplikte din søknad avhengigheter hvis du bygger et bibliotek.
Merk at siden1.13
Go også aktivert modulen proxy-funksjonen (ved hjelp av https://proxy.golang.org
som sin modul proxy-server som standard). Les mer om det here
for å se om det passer alle dine krav og begrensninger. Hvis det gjør det, trenger du ikke katalogenvendor
i det hele tatt.
Tjenesteprogramkataloger
/ api
OpenAPI / Swagger-spesifikasjoner, JSON-skjemafiler, protokolldefinisjonsfiler.
se katalogen/api
for eksempler.
Webapplikasjonskataloger
/ web
webapplikasjonsspesifikke komponenter: statiske nettressurser, serversidemaler og Spa.
Vanlige Programkataloger
/configs
Konfigurasjonsfilmaler eller standard configs.
Legg inn confd
eller consul-template
malfiler her.
/init
system init (systemd, upstart, sysv) og prosessleder / veileder (runit, supervisord) konfigs.
/scripts
Skript for å utføre ulike bygge, installere, analyse, etc operasjoner.
disse skriptene holder rotnivået Makefile lite og enkelt (f.eks.https://github.com/hashicorp/terraform/blob/master/Makefile
).
se katalogen/scripts
for eksempler.
/build
Emballasje Og Kontinuerlig Integrasjon.
Sett din cloud (AMI), container (Docker), OS (deb, rpm, pkg) pakke konfigurasjoner og skript i katalogen/build/package
.
Sett DIN CI (travis, circle, drone) konfigurasjoner og skript i/build/ci
katalogen. Merk at NOEN AV CI-verktøyene (f. eks., Travis CI) er veldig kresen om plasseringen av deres config-filer. Prøv å sette config-filene i katalogen/build/ci
koble dem til stedet DER CI-verktøyene forventer dem (når det er mulig).
/distribusjoner
konfigurasjoner og maler for distribusjon av IaaS, PaaS, system-og containerorganisering (docker-compose, kubernetes / helm, mesos, terraform, bosh). Merk at i noen repos (spesielt apps distribuert med kubernetes) kalles denne katalogen /deploy
.
/test
Ytterligere eksterne testapper og testdata. Du er velkommen til å strukturere/test
katalogen uansett du vil. For større prosjekter er det fornuftig å ha en data underkatalog. For eksempel kan du ha /test/data
eller/test/testdata
hvis Du Trenger å gå for å ignorere hva som er i den katalogen. Merk At Go vil også ignorere kataloger eller filer som begynner med “.”eller”_”, så du har mer fleksibilitet når det gjelder hvordan du navngir testdatakatalogen din.
se katalogen/test
for eksempler.
Andre Kataloger
/ docs
Design og brukerdokumenter (i tillegg til godoc generert dokumentasjon).
se katalogen/docs
for eksempler.
/verktøy
Støtteverktøy for dette prosjektet. Merk at disse verktøyene kan importere kode fra katalogene/pkg
og/internal
.
se katalogen/tools
for eksempler.
/ eksempler
Eksempler for dine applikasjoner og / eller offentlige biblioteker.
se katalogen/examples
for eksempler.
/third_party
Eksterne hjelpeverktøy, forked kode og andre 3. parts verktøy(F. eks.
/githooks
Git kroker.
/ eiendeler
Andre eiendeler som følger med depotet ditt(bilder, logoer, etc).
/ website
dette er stedet å sette prosjektets nettstedsdata hvis du ikke bruker GitHub-sider.
se katalogen/website
for eksempler.
Kataloger Du Ikke burde ha
/src
Noen go-prosjekter har ensrc
mappe, men det skjer vanligvis når utviklerne kom fra Java-verdenen der Det er et vanlig mønster. Hvis du kan hjelpe deg selv, prøv å ikke vedta Dette Java-mønsteret. Du vil virkelig ikke At Go-koden eller go-prosjektene skal se Ut Som Java : -)
ikke forveksle prosjektnivået /src
katalogen med/src
katalogen Go bruker for arbeidsområdene som beskrevet iHow to Write Go Code
$GOPATH
miljøvariabelen peker på ditt (nåværende) arbeidsområde(som standard peker det på $HOME/go
på ikke-windows-systemer). Dette arbeidsområdet inkluderer øverste nivå/pkg
/bin
og/src
kataloger. Ditt faktiske prosjekt ender opp som en underkatalog under /src
, så hvis du har /src
katalogen i prosjektet ditt, vil prosjektbanen se slik ut: /some/path/to/workspace/src/your_project/src/your_code.go
. Legg merke Til At Med Go 1.11 det er mulig å ha prosjektet ditt utenfor GOPATH
, men det betyr fortsatt ikke at det er en god ide å bruke dette layoutmønsteret.
Merker
-
Gå Rapport Kort – det vil skanne koden din med
gofmt
go vet
gocyclo
golint
ineffassign
license
ogmisspell
. Erstattgithub.com/golang-standards/project-layout
med prosjektreferansen. -
GoDoc-Det vil gi online versjon Av din godoc generert dokumentasjon. Endre koblingen for å peke til prosjektet ditt.
-
Pkg.gå.dev-Pkg.gå.dev er et nytt mål for go discovery & docs. Du kan opprette et merke ved hjelp av merkegenereringsverktøyet.
-
Release-Det vil vise den nyeste utgivelsen nummer for prosjektet. Endre github-lenken for å peke på prosjektet ditt.
Notater
en mer sta prosjektmal med prøve / gjenbruk konfigs, skript og kode er ET VIA.