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
.