Předpokládáme, že jste si přečetli můj příspěvek Začínáme projekt Go, měli byste mít výchozí bod pro minimální webovou službu Go. Pro váš první projekt je jednodušší mít všechen kód v jedné složce, v základu projektu, ale v určitém okamžiku budete chtít věci restrukturalizovat, což se dělá z několika důvodů:

  • Mít vše v jedné složce má za následek mnoho vzájemných závislostí v kódu.
  • Znovupoužití mimo projekt může být obtížné, protože kód je určen pouze pro použití v jednom balíčku.
  • Není možné mít více než jednu binárku, protože můžete mít pouze jednu main metodu.

Tento příspěvek poskytne přehled struktury, kterou dodržuji ve svých projektech Go při vytváření webových služeb.

Poznámka: Pokud vytváříte pouze knihovnu pro použití ve svých službách nebo pro sdílení s ostatními, je v pořádku umístit vše do základní složky projektu, příkladem je moje knihovna dynastore.

/cmd

Tato složka obsahuje hlavní soubory vstupního bodu aplikace pro projekt, přičemž název adresáře odpovídá názvu pro binární soubor. Tedy například cmd/simple-service, což znamená, že binárka, kterou zveřejníme, bude simple-service.

/internal

Tento balíček obsahuje soukromý kód knihovny používaný ve vaší službě, je specifický pro funkci služby a není sdílen s jinými službami. Je třeba si uvědomit, že toto soukromí je vynucováno samotným překladačem, více informací naleznete v poznámkách k vydání Go 1.4.

/pkg

Tato složka obsahuje kód, který je v pořádku, aby jej mohly využívat jiné služby, může se jednat o klienty API nebo užitečné funkce, které mohou být užitečné pro jiné projekty, ale neopravňují vlastní projekt. Osobně tuto složku používám raději než internal, hlavně proto, že mám rád věci otevřené pro opakované použití ve většině projektů.

Struktura projektu

Při vytváření projektu byste měli zvážit několik velmi důležitých cílů, pokud jde o strukturu balíčků:

  • Udržujte věci konzistentní
  • Udržujte věci co nejjednodušší, ale ne jednodušší
  • Volně párujte části služby nebo aplikace
  • Snažte se zajistit snadnou orientaci

Při začátcích byste měli trochu experimentovat, vyzkoušet několik různých nápadů při sestavování svého prvního a získat zpětnou vazbu na základě výše uvedených cílů.

Cílem číslo jedna je, abyste vytvořili snadno udržovatelný, konzistentní a spolehlivý software.

Příklad

Doporučuji podívat se na exitus, abyste viděli, jak strukturuju své projekty, většina kódu je ve složce pkg, přičemž každá podsložka má jeden nebo více souborů. Z nejvyšší úrovně je celkem jasné, čeho se jednotlivé balíčky týkají, a i když jsou chudé na testy, má několik příkladů.

$ 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│ │ ├── migrate.go│ │ ├── sqlhooks.go│ │ └─ transactions.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

Cílem je ukázat, jak můžete svůj projekt rozšířit z několika souborů na větší webovou službu. Doporučuji vám, abyste si prošli projekty na githubu, zjistili, jak je strukturovali jiní vývojáři, a hlavně si to sami vyzkoušeli!

  • GopherCon EU 2018: Peter Bourgon – Best Practices for Industrial Programming
  • Standardní rozvržení projektu Go
  • GopherCon 2018: Cat Seeing – How Do You Structure Your Go Apps

Feedback

Neváhejte a kontaktujte nás prostřednictvím:

  • @ mě na Twitteru
  • Pošlete mi e-mail
  • Začínáte s Go projektem
  • Stavba oslího auta WLToys A979
  • Začínáte s Cognito?
  • Proč CDK?
  • Bezserverové úlohy na pozadí, část 2

.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna.