Á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 core <modul> [--db <név>]
├── add handler <modul> <surface> <művelet> --method GET --path "/x/{id}"
├── 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
├── upgrade templates [--force]
└── version
Gyors, parancsonkénti tájékozódás:
- A
new modulemodult generál: belépési pont, első surface, kontraktus, plusz a modul-szintűcore/repositoryvázak. - Az
add surfaceújabb surface-t ad egy meglévő modulhoz. - Az
add handleregy műveletet ad egy meglévő surface-hez. - 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 corea közöscore/és a modul-szintűrepository/vázakat 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 --kit-replace/--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 | 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ó) |
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
kit: github.com/gp-system/gpsystem@v0.1.0
engine: chi
db: pgx
templatesSHA: 4f2a… # a telepített oapi template-készlet checksumja
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.
engine mindig chi: a gpsystem kizárólag net/http (chi) alapú backendet generál, és a LoadManifest is csak ezt az értéket fogadja el; egy ettől eltérő engine-értékű manifest betöltése világos hibával áll le, nem generál csendben hibás kódot.