Jos olet lukenut postaukseni Go-projektin aloittaminen, sinulla pitäisi olla lähtökohta minimaaliselle Go web-palvelulle. Ensimmäisessä projektissa on helpompaa pitää kaikki koodi yhdessä kansiossa, projektin pohjalla, mutta jossain vaiheessa haluat järjestää asiat uudelleen, tämä tehdään muutamasta syystä:
- Kaiken pitäminen yhdessä kansiossa johtaa siihen, että koodissa on paljon keskinäisiä riippuvuuksia.
- Kuinkäyttö projektin ulkopuolella voi olla vaikeaa, koska koodi on suunniteltu käytettäväksi vain yhdessä paketissa.
- Ei ole mahdollista pitää useampaa kuin yhtä binääritiedostoa, koska sinulla voi olla vain yksi
main
-metodi.
Tämä viesti antaa yleiskatsauksen rakenteesta, jota noudatan Go-projekteissani web-palveluita rakentaessani.
Huomautus: Jos rakennat vain kirjaston käytettäväksi palveluissasi tai jaettavaksi muiden kanssa, on OK laittaa kaikki projektin peruskansioon, esimerkkinä tästä on dynastore-kirjastoni.
/cmd
Tämä kansio sisältää projektin tärkeimmät sovelluksen aloituspistetiedostot, hakemistonimi vastaa binäärin nimeä. Eli esimerkiksi cmd/simple-service
tarkoittaa, että julkaisemamme binääri on simple-service
.
/internal
Tämässä paketissa on palvelussasi käytettävä yksityinen kirjastokoodi, se on nimenomaan palvelun toiminnalle ominaista eikä sitä jaeta muiden palvelujen kanssa. Huomioitavaa on, että tämä yksityisyys on kääntäjän itsensä valvoma, katso lisätietoja Go 1.4:n julkaisutiedotteista.
/pkg
Tämä kansio sisältää koodia, jota muut palvelut voivat käyttää, tämä voi sisältää API-asiakkaita tai apufunktioita, jotka voivat olla käteviä toisille projekteille, mutta eivät oikeuta omaa projektia. Itse käytän tätä mieluummin kuin internal
, lähinnä siksi, että haluan pitää asiat avoimina uudelleenkäyttöä varten useimmissa projekteissa.
Projektin rakenne
Kun rakennat projektiasi, on olemassa joitakin hyvin tärkeitä tavoitteita, jotka sinun tulisi ottaa huomioon, kun on kyse siitä, miten rakennat pakettisi:
- Pitäkää asiat johdonmukaisina
- Pitäkää asiat mahdollisimman yksinkertaisina, mutta ei yksinkertaisempina
- Parittakaa löyhästi palvelun tai sovelluksen osioita
- Pyrkikää siihen, että siinä on helppo navigoida
Kaiken kaikkiaan aloittaessasi sinun kannattaa kokeilla hieman, kokeilla muutamaa erilaista ideaa rakentaessasi ensimmäistä kertaa ja saada palautetta edellä mainittujen tavoitteiden perusteella.
Ykköstavoitteena on, että rakennat helposti ylläpidettäviä, johdonmukaisia ja luotettavia ohjelmistoja.
Esimerkki
Suosittelen vilkaisemaan exitusta nähdäksesi, miten jäsennän projektini, suurin osa koodista on pkg
-kansion alla, ja jokaisessa alikansiossa on yksi tai useampi tiedosto. Ylätasolta on melko selvää, mihin kukin paketti liittyy, ja vaikka se nojaa testeihin, siinä on muutama esimerkki.
$ 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│ │ ├─ dbtesting.go│ │ ├─ migrate.go│ │ ├─ sqlhooks.go│ │ ├─ sqlhooks.go│ │ ├─ transaktiot.go│ │ └─ transactions.go│ │ └─ transaktiot.go│ └─ transaktiot.go│ └─ transaktiot.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│ ├── 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
Tarkoitus on havainnollistaa, miten projektia kasvatetaan parista tiedostosta suuremmaksi verkkopalveluksi. Kannustan sinua selaamaan github-projekteja ja tutkimaan, miten muut kehittäjät ovat rakentaneet omansa, ja ennen kaikkea kokeilemaan sitä itse!
- GopherCon EU 2018: Peter Bourgon – Parhaat käytännöt teolliseen ohjelmointiin
- Standard Go Project Layout
- GopherCon 2018: Cat Seeing – How Do You Structure Your Go Apps
Feedback
Feel free to reach out via:
- @ minut Twitterissä
- lähetä minulle sähköpostia
- Starting a Go Project
- Building a WLToys A979 donkey car
- Getting started with Cognito?
- Miksi CDK?
- Palvelimeton taustatyö osa 2