Áttekintés
A fogyasztó projektek a Go 1.24+ tool directive-vel rögzítik a CLI-t a go.mod-ban (a new project írja be), így a csapat minden tagja ugyanazt a verziót futtatja:
go tool gpsystem <parancs>
gpsystem
├── new project <név> --module-path <path> [--dir] [--db pgx|bun]
├── new module <név> [--surface <név>]
├── new migration <név>
├── add surface <modul> <surface> [--db <név>]
├── add domain <modul> [--db <név>]
├── add handler <modul> <surface> <művelet> --method GET --path "/x/{id}"
├── add auth [--module auth] [--social discord,facebook,apple,google]
├── add event <modul> <név>
├── add listener <modul> <event> <név> [--queue <sor>]
├── add job <modul> <név> --cron "0 3 * * *"
├── add mail <modul> <név>
├── add notification <modul> <név>
├── add worker
├── add realtime
├── add db <modul> <név> [--connector pgx|bun]
├── add seeder <név>
├── add compose
├── add docker
└── version
Gyors, parancsonkénti tájékozódás:
- A
new modulemodult generál: belépési pont, első surface, kontraktus, plusz a modul gyökércsomagjának és a modul-szintűrepository/-nak a váza. - Az
add surfaceújabb surface-t ad egy meglévő modulhoz. - Az
add handleregy műveletet ad egy meglévő surface-hez. - Az
add authegy teljes auth-modult scaffoldol (DB-alapú RBAC-séma, register/verify-email/login/refresh/logout/password-reset végpontok, plusz social login réteg), és automatikusan beköti az autentikációt: minden modul belépési pontjába beszúrja azapi.Use(server.IdentityMiddleware(cfg.JWT))sort agpsystem:api-middlewareanchornál, és agpsystem.yaml-be írja azauth: <modul>bejegyzést, így a később generált modulok maguktól ezzel a sorral születnek. Régebbi projekten, ahol amain.go-ból hiányzik az anchor, nem hibázik, hanem kiírja a kézzel beillesztendő sort. Lásd Autentikáció. - Az
add eventlétrehoz egy eventet, és bedrótozza a modulba az outbox dispatchert. - Az
add listenerfeliratkozik egy eventre (a--queueegy nevesített asynq sorra irányítja). - Az
add jobütemez egy ismétlődő handlert.
Azadd event/add listener/add jobacmd/workerbinárishoz készít háttérmunkát (lásd a worker koncepciókat); minden projekt tartalmazza a workert, így ezek a parancsok azonnal használhatók. - Az
add mailegy modul-tulajdonú mail-notifiert (payload + sablonok) generál, és a projekt első notifierénél bedrótoz egy közösmail.Mailer-t minden belépési pontba. - Az
add notificationegy modul-tulajdonú, többcsatornás notificationt (payload +Via+ csatornánkénti tartalom) generál, és a projekt első notificationjénél bedrótoz egy közösnotify.Sender-t minden belépési pontba, plusz anotificationstábla migrációt. - Az
add realtimea dedikált, horizontálisan skálázhatócmd/realtimegatewayt scaffoldolja, ami élőben kézbesíti a notificationöket a csatlakozott klienseknek. - Az
add workerhozzáadja a worker-réteget (cmd/worker, modulonkéntilisteners//jobs/alcsomagok, az outbox migráció) egy olyan projekthez, amelyben még nincs. - A
new migrationszámozott goose SQL migrációt hoz létre amigrations/mappában. - Az
add dbegy modulhoz ad hozzá egy másik, önálló adatbázis-kapcsolatot (saját pool, config ésDependenciesmezők, pgx vagy bun); azadd surface --dba modul közös repository-vázát köti hozzá. - Az
add domaina modul gyökércsomagjának domain-fájljait (<modul>.go,errors.go) és a modul-szintűrepository/vázat adja hozzá egy olyan modulhoz, amelyben ezek még nincsenek meg (tisztán additív, anchorhoz nem nyúl). - Az
add composeönállóan (újra)generálja acompose.yml-t (alap stack + egy service manifest-modulonként); azadd dockera Dockerfile-t/.dockerignore-t generálja újra.
Globális flagek minden parancson: --dry-run (a terv kiírása, írás nélkül) és --force (felülírás engedélyezése). A new project ezeken felül elfogadja a --replace/--replace-dev flageket is: ez egy contributor/dev-mode funkció, ami a generált go.mod replace-direktíváit lokális modul-checkoutokra irányítja; a hétköznapi fogyasztó-projekteknek sosem kell hozzájuk nyúlniuk, lásd new project: contributor mód.
Biztonsági szabályok
- A teljes fájlterv előre elkészül; ha bármely cél létezik, az egész futás megszakad, mielőtt bármi íródna (kivéve
--force). Részleges írás nincs.--forceesetén a futás folytatódik, de előbb minden felülírandó létező fájlra kiír egyoverwriting <path>sort, így az újragenerálás soha nem írja felül némán a fájlokat. - A generált
.gofájlok goimports-szal formázódnak; az érvénytelen Go-t renderelő template hangosan hibázik. - Meglévő fájl kizárólag anchor-kommenteknél módosul, sehol máshol.
- A beszúrások idempotensek: egy generátor újrafuttatása sosem duplikál blokkot.
Anchorok
| Anchor | Fájl | Beszúrja |
|---|---|---|
gpsystem:modules | spec/typespec/main.tsp | new module / add surface |
gpsystem:imports, gpsystem:surfaces | surfaces/register.go | new module / add surface |
gpsystem:operations | <surface>.tsp | add handler |
gpsystem:modules, gpsystem:deps-init(<modul>) | cmd/worker/main.go | new module / add worker / add event |
gpsystem:listeners | listeners/register.go | add listener |
gpsystem:jobs | jobs/register.go | add job |
gpsystem:pools, gpsystem:closers | cmd/<modul>/main.go, cmd/worker/main.go | add db (nevesített kapcsolat poolja / closere), add mail (közös mailer konstrukció), add notification (közös notifier + publisher konstrukció/closer) |
gpsystem:config | internal/platform/config/config.go | add db (nevesített kapcsolat config mezője), add mail (Mail smtp.Config), add realtime (Realtime realtime.Config) |
gpsystem:dependencies-init, gpsystem:deps-init(<modul>) | cmd/<modul>/main.go, cmd/worker/main.go | add mail (Mailer: mailer,), add notification (Notifier: notifier,) |
gpsystem:topics | cmd/realtime/main.go | add realtime (megosztott topic-csatorna authorizáció) |
gpsystem:api-middleware | cmd/<modul>/main.go | add auth (api.Use(server.IdentityMiddleware(cfg.JWT)) minden modul api routerére) |
Két további anchor a saját kódod varrata, nem generátor-cél: a gpsystem:middleware (a server.Run opciólistájában, ide kerülnek a WithStack/WithMiddleware opciók; lásd a framework servere) és a gpsystem:surface-middleware (minden surface Route-blokkjának első sora, a route-csoport middleware-ek helye, pl. r.Use(server.RequireRole("admin"))).
A manifest: gpsystem.yaml
A new project írja a projekt gyökerébe; a CLI felfelé sétálva találja meg a projektet.
version: 1
name: shop
module: github.com/acme/shop
framework: github.com/gp-system/framework@v0.0.0
db: pgx
auth: auth # az add auth által generált modul; amíg nem futott, nincs jelen
modules:
news:
surfaces: [api, admin]
dbs:
- name: analytics
connector: bun
surfaceDBs:
admin: analytics
Ez a generátorok igazságforrása arról, mi létezik (az add surface news admin azonnal hibázik, ha a modul hiányzik vagy a surface már megvan), és a module mezőt a go.mod-dal is összeveti. A dbs/surfaceDBs csak akkor jelenik meg, ha a modulnak van nevesített kapcsolata (add db révén); a nélkülük írt manifestek változatlanul betöltődnek. Az auth az add auth lefutása után jelenik meg, és az általa generált modult nevezi meg: a new module ebből tudja, hogy az új belépési pontokba automatikusan renderelje az identity middleware sorát.
--engine flag.