golang-standarder/prosjekt-layout

Oversettelser:

  • 한국어 문서
  • 简体中文
  • 正體中文
  • 正體中文
  • ??
  • Franç
  • 日本語
  • portugisisk
  • Españ

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 37554og 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 Russia 2018: Ashley McNamara + Brian Ketelsen-Beste praksis.

  • GopherCon 2017: Edward Muller-Go Anti-Patterns
  • GopherCon 2018: Kat Zien-Hvordan Strukturerer Du Dine Go Apps

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/dataeller/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 gofmtgo vetgocyclogolintineffassignlicense og misspell. Erstatt github.com/golang-standards/project-layout med prosjektreferansen.

    Gå Rapport Kort

  • GoDoc-Det vil gi online versjon Av din godoc generert dokumentasjon. Endre koblingen for å peke til prosjektet ditt.

    Gå Til Doc

  • 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.

    PkgGoDev

  • Release-Det vil vise den nyeste utgivelsen nummer for prosjektet. Endre github-lenken for å peke på prosjektet ditt.

    Release

Notater

en mer sta prosjektmal med prøve / gjenbruk konfigs, skript og kode er ET VIA.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.