golang-standards/project-layout

Translations:

  • ??
  • Français
  • 日本語
  • Portugali

  • Español

yleiskatsaus

Tämä on go-sovellusprojektien perusasetelma. Se ei ole virallinen standardi, jonka core Go dev-tiimi on määritellyt; se on kuitenkin joukko yhteisiä historiallisia ja nousevia projektien asettelumalleja Go-ekosysteemissä. Jotkut näistä malleista ovat suositumpia kuin toiset. Se on myös useita pieniä parannuksia sekä useita tukevia hakemistoja yhteinen tahansa tarpeeksi suuri reaalimaailman sovellus.

Jos yrität oppia Go: ta tai jos rakennat PoC-tai leluprojektia itsellesi, tämä projektin asettelu on ylilyönti. Aloita jotain todella yksinkertaista (yksi main.go tiedosto on enemmän kuin tarpeeksi). Kun projekti kasvaa pitää mielessä, että se on tärkeää varmistaa, että koodi on hyvin jäsennelty muuten voit päätyä sotkuinen koodi, jossa on paljon piilotettuja riippuvuuksia ja maailmanlaajuinen tila. Kun projektissa on enemmän ihmisiä töissä, tarvitaan vielä enemmän rakennetta. Silloin on tärkeää ottaa käyttöön yhteinen tapa hallita paketteja / kirjastoja. Kun sinulla on avoimen lähdekoodin projekti tai kun tiedät muiden projektien tuovan koodin projektivarastostasi, silloin on tärkeää saada yksityisiä (alias internal) paketteja ja koodia. Kloonaa arkisto, Säilytä mitä tarvitset ja poista kaikki muu! Vaikka se on siellä, se ei tarkoita, että sinun täytyy käyttää sitä kaikkea. Mitään näistä kaavoista ei käytetä jokaisessa projektissa. Edes vendor – kuvio ei ole universaali.

Go 1.14 Go Modules ovat vihdoin valmiita tuotantoon. Käytä Go Modules ellei sinulla ole erityistä syytä olla käyttämättä niitä ja jos käytät, sinun ei tarvitse huolehtia $GOPATHISTA ja siitä, mihin laitat projektisi. Perus go.mod tiedosto repossa olettaa, että projektisi isännöi GitHubia, mutta se ei ole vaatimus. Moduuli polku voi olla mitä tahansa, vaikka ensimmäinen moduuli polku komponentti pitäisi olla piste sen nimi (nykyinen versio Go ei pakota sitä enää, mutta jos käytät hieman vanhempia versioita älä ole yllättynyt, jos rakentaa epäonnistua ilman sitä). Katso kysymykset 37554 ja 32819, jos haluat tietää siitä enemmän.

tämä projektin asettelu on tarkoituksellisesti yleinen, eikä se yritä määrätä tiettyä Go-pakettirakennetta.

Tämä on yhteisön ponnistus. Avaa ongelma, jos näet uuden kuvion tai jos luulet, että jokin olemassa olevista kaavoista on päivitettävä.

Jos tarvitset apua nimeämisessä, muotoilussa ja tyylissä, aloita ajamalla gofmt ja golint. Muista lukea myös nämä Go code style-ohjeet ja suositukset:

    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 li>tyyliohje Go-paketeille (rakyll/JBD)

katso Go Project Layout lisätietoja taustoista.

Lisää pakettien nimeämisestä ja järjestämisestä sekä muista koodirakennesuosituksista:

  • GopherCon EU 2018: Peter Bourgon – Best Practices for Industrial Programming
  • GopherCon Venäjä 2018: Ashley McNamara + Brian Ketelsen – Go best practices.
  • GopherCon 2017: Edward Muller-Go Anti – Patterns
  • GopherCon 2018: Kat Zien-How Do You Structure Your Go Apps

a Chinese Post about Package-Oriented-Design guidelines and Architecture layer

  • Go directories

    /cmd

    main applications for this project.

    kunkin sovelluksen hakemistonimen tulee vastata haluamasi suoritustiedoston nimeä (esim. /cmd/myapp).

    älä laita paljon koodia sovellushakemistoon. Jos luulet, että koodia voi tuoda ja käyttää muissa projekteissa, niin sen pitäisi elää /pkg hakemistossa. Jos koodi ei ole uudelleenkäytettävä tai jos et halua muiden käyttävän sitä uudelleen, laita se /internal – hakemistoon. Tulet yllättymään siitä, mitä muut tekevät, joten kerro selkeästi aikeistasi!

    on tavallista, että main funktio tuo ja vetoaa koodin /internal ja /pkg hakemistoista eikä mistään muusta.

    katso /cmd hakemistosta esimerkkejä.

    /sisäinen

    yksityinen sovellus ja kirjastokoodi. Tämä on koodi, jota et halua muiden tuovan sovelluksissaan tai kirjastoissaan. Huomaa, että Go-kääntäjä itse valvoo tätä asettelumallia. Katso tarkemmat tiedot Go 1.4 release notes. Huomaa, että et ole rajoittunut ylätason internal hakemistoon. Sinulla voi olla useampi kuin yksi internal Hakemisto millä tahansa projektipuun tasolla.

    voit valinnaisesti lisätä hieman ylimääräistä rakennetta sisäisiin paketteihisi erottaaksesi jaetun ja ei-jaetun sisäisen koodin. Sitä ei tarvita (varsinkaan pienemmissä projekteissa), mutta on mukavaa saada visuaalisia vihjeitä, jotka osoittavat pakkauksen käyttötarkoituksen. Varsinainen sovelluskoodi voi mennä /internal/app hakemistoon (esim. /internal/app/myapp) ja näiden sovellusten jakama koodi /internal/pkg hakemistoon (esim. /internal/pkg/myprivlib).

    /pkg

    Kirjastokoodi, jota on OK käyttää ulkoisissa sovelluksissa (esim., /pkg/mypubliclib). Muut Projektit tuovat näitä kirjastoja odottaen niiden toimivan, joten mieti kahdesti ennen kuin laitat jotain tähän: -) huomaa, että internal hakemisto on parempi tapa varmistaa, että yksityiset pakettisi eivät ole tuotavissa, koska Go valvoo sitä. /pkg hakemisto on edelleen hyvä tapa ilmoittaa yksiselitteisesti, että kyseisen hakemiston koodi on turvallinen muiden käyttöön. Travis Jefferyn I'll take pkg over internal blogikirjoitus antaa hyvän yleiskuvan pkg ja internal hakemistoista ja siitä, milloin niiden käyttäminen voisi olla järkevää.

    se on myös tapa ryhmitellä Go-koodi yhteen paikkaan, kun juurihakemisto sisältää paljon ei – Go – komponentteja ja kansioita, mikä helpottaa erilaisten Go – työkalujen suorittamista (kuten näissä keskusteluissa on mainittu: Best Practices for Industrial Programming alkaen GopherCon EU 2018, GopherCon 2018: Kat Zien-How Do You Structure Your Go Apps and GoLab 2018-Massimiliano Peppi-Project layout patterns in Go).

    Katso /pkg hakemistosta, jos haluat nähdä, mitkä Suositut Go-repot käyttävät tätä projektin asettelukuviota. Tämä on yleinen asettelumalli, mutta se ei ole yleisesti hyväksytty ja jotkut Go-yhteisössä eivät suosittele sitä.

    on ok olla käyttämättä sitä, jos sovellusprojekti on todella pieni ja jos ylimääräinen pesintätaso ei tuo paljon lisäarvoa (ellet oikeasti halua :-)). Ajattele sitä, kun se on tulossa tarpeeksi iso ja juurihakemisto saa melko kiireinen (varsinkin jos sinulla on paljon ei-Go sovelluksen osia).

    /myyjä

    sovellusten riippuvuudet (hallitaan manuaalisesti tai suosikkiriippuvuuden hallintatyökalulla, kuten uusi sisäänrakennettu Go Modules ominaisuus). go mod vendor komento Luo /vendor hakemiston sinulle. Huomaa, että saatat joutua lisäämään -mod=vendor lipun go build – komentoon, jos et käytä Go 1.14-komentoa, jossa se on oletuksena päällä.

    älä toimita sovellusriippuvuuksiasi, jos rakennat kirjastoa.

    huomaa, että koska 1.13 Go otti käyttöön myös moduulin välityspalvelimen (käyttäen https://proxy.golang.org oletuksena moduulin välityspalvelimenaan). Lue siitä lisää here, sopiiko se kaikkiin vaatimuksiisi ja rajoitteisiisi. Jos näin käy, et tarvitse vendor hakemistoa lainkaan.

    Service Application Directories

    /api

    OpenAPI / Swagger specs, JSON schema files, protocol definition files.

    katso /api hakemistosta esimerkkejä.

    Web-Sovelluskansiot

    /web

    Web-sovelluskohtaiset komponentit: staattiset web-varat, palvelinpuolen mallit ja kylpylät.

    Yleiset Sovellushakemistot

    /configs

    Asetustiedostomallit tai oletusmääritykset.

    laita confd tai consul-template mallitiedostot tähän.

    /init

    System init (systemd, upstart, sysv) ja process manager / supervisor (runit, Supervisory) configs.

    /skriptit

    skriptit erilaisten rakennus -, asennus -, analysointi-jne.toimintojen suorittamiseen.

    nämä skriptit pitävät juuritason pienenä ja yksinkertaisena (esimerkiksi https://github.com/hashicorp/terraform/blob/master/Makefile).

    katso /scripts hakemistosta esimerkkejä.

    /build

    pakkaus ja jatkuva integraatio.

    laita pilvi (AMI), kontti (Docker), käyttöjärjestelmä (deb, rpm, pkg) pakettikokoonpanot ja skriptit /build/package hakemistoon.

    laita CI: n (travis, circle, drone) kokoonpanot ja skriptit /build/ci hakemistoon. Huomaa, että jotkut CI työkalut (esim., Travis CI) ovat hyvin nirsoja niiden asetustiedostojen sijainnista. Yritä laittaa asetustiedostot /build/ci hakemistoon, joka yhdistää ne paikkaan, jossa tiedonsiirron työkalut odottavat niitä (jos mahdollista).

    /deployments

    IaaS, PaaS, system and container orchestration deployment configurations and templates (docker-compose, kubernetes/helm, mesos, terraform, bosh). Huomaa, että joissakin repoissa (erityisesti kubernetesin kanssa käyttöönotetuissa sovelluksissa) tätä hakemistoa kutsutaan nimellä /deploy.

    /testi

    ulkoiset testisovellukset ja testitiedot. Voit vapaasti jäsentää /test hakemiston miten haluat. Isompien projektien kohdalla on järkevää käyttää data-alihakemistoa. Esimerkiksi /test/data tai /test/testdata, jos haluat ohittaa sen, mitä kyseisessä hakemistossa on. Huomaa, että Go ohittaa myös hakemistot tai tiedostot, jotka alkavat “.”tai”_”, Joten sinulla on enemmän joustavuutta sen suhteen, miten nimeät testitietohakemistosi.

    katso /test hakemistosta esimerkkejä.

    muut hakemistot

    /docs

    suunnittelu-ja käyttäjäasiakirjat (Oman godocin tuottaman dokumentaation lisäksi).

    katso /docs hakemistosta esimerkkejä.

    /työkalut

    tämän projektin tukityökalut. Huomaa, että nämä työkalut voivat tuoda koodia /pkg ja /internal hakemistoista.

    katso /tools hakemistosta esimerkkejä.

    /examples

    Examples for your applications and / or public libraries.

    katso /examples hakemistosta esimerkkejä.

    /third_party

    ulkoiset aputyökalut, haaroitetut koodit ja muut kolmannen osapuolen apuohjelmat (esim.Swagger UI).

    /githooks

    Git hooks.

    /varat

    muut varat, jotka menevät arkistosi mukana (kuvat, logot jne.).

    /verkkosivusto

    tähän voi laittaa projektisi verkkosivujen tiedot, Jos et käytä GitHub-sivuja.

    katso /website hakemistosta esimerkkejä.

    hakemistoja sinulla ei pitäisi olla

    /src

    joissakin Go-projekteissa on src kansio, mutta yleensä se tapahtuu, kun devs tuli Java-maailmasta, jossa se on yleinen kuvio. Jos voit auttaa itseäsi yrittää olla hyväksymättä tätä Java kuvio. Et todellakaan halua Go-koodisi tai Go-projektisi näyttävän Javalta: -)

    älä sekoita projektitasoa /src hakemiston kanssa /src directory Go käyttää työtiloihinsa How to Write Go Code$GOPATH ympäristömuuttuja osoittaa (nykyisen) työtilasi (oletuksena se osoittaa $HOME/go muissa kuin windows-järjestelmissä). Tämä työtila sisältää ylätason /pkg/bin ja /src hakemistot. Varsinainen projekti päätyy alihakemistoksi alle /src, joten jos sinulla on /src Hakemisto projektissasi, projektin polku näyttää tältä: /some/path/to/workspace/src/your_project/src/your_code.go. Huomaa, että Go 1.11 on mahdollista saada projekti GOPATH, mutta se ei silti tarkoita, että olisi hyvä idea käyttää tätä asettelukuviota.

    Badges

    • Go Report Card – It will scan your code with gofmtgo vetgocyclogolintgolintgolintineffassignlicense ja misspell. Korvaa github.com/golang-standards/project-layout projektiviitteellä.

      Go Report Card

    • GoDoc – se tarjoaa online-version Godocin tuottamasta dokumentaatiosta. Vaihda linkki kohtaan projektisi.

      Go Doc

    • pkg.Mene.dev-Pkg.Mene.dev on uusi kohde Go Discoverylle & docs. Voit luoda merkin badge generation-työkalulla.

      PkgGoDev

    • Release – se näyttää projektisi uusimman julkaisunumeron. Vaihda GitHub-linkki projektiin.

      Release

    Notes

    opinionoidumpi projektimalli sample / reusable configs, scripts and code on WIP.

Vastaa

Sähköpostiosoitettasi ei julkaista.