Bun 入门套件
Bun 入门套件 包含
您还可以查看 bun-realworld-app,它是一个使用 Bun 入门套件构建的 JSON API。
应用程序结构
入门套件具有以下结构
├─ bunapp
│ └─ app.go
│ └─ config.go
│ └─ router.go
│ └─ start.go
│ └─ hook.go
│ └─ embed
│ └─ config
│ └─ dev.yaml
│ └─ test.yaml
├─ cmd
│ └─ bun
│ └─ main.go
│ └─ migrations
│ └─ main.go
│ └─ 20210505110026_init.go
├─ example
│ └─ init.go
│ └─ example_handler.go
│ └─ example_handler_test.go
├─ .gitignore
└─ go.mod
主要入口点是
bunapp/app.go
包含App
结构,该结构维护应用程序状态。例如,App.DB()
创建*bun.DB
。bunapp/config.go
包含Config
结构,用于解析 YAML 配置,例如bunapp/embed/config/dev.yaml
。cmd/bun/migrations
包含数据库迁移。example/init.go
是包入口点。
您应该将 HTTP 处理程序和 DB 模型保存在同一个包中,但将应用程序拆分为逻辑上隔离的包。每个包都应该有一个 init.go
文件,其中包含模块初始化逻辑。
启动应用程序
该套件提供了方便的方法来启动/停止应用程序
func main() {
ctx, app, err := bunapp.Start(ctx, "service_name", "environment_name")
if err != nil {
panic(err)
}
defer app.Stop()
}
它还提供了钩子,用于在应用程序启动/停止时执行自定义代码。您通常从模块的 init.go
文件中的 init
函数添加钩子。
func init() {
bunapp.OnStart("hook.name", func(ctx context.Context, app *bunapp.App) error {
app.Router().GET("/endpoint", handler)
app.OnStop("hook.name", func(ctx context.Context, app *bunapp.App) error {
log.Println("stopping...")
})
return nil
})
}
迁移
该套件还提供了一个 CLI 来管理迁移
go run cmd/bun/main.go
NAME:
bun db - manage database migrations
USAGE:
bun db [global options] command [command options] [arguments...]
COMMANDS:
init create migration tables
migrate migrate database
rollback rollback the last migration group
unlock unlock migrations
create_go create a Go migration
create_sql create a SQL migration
help, h Shows a list of commands or help for one command
GLOBAL OPTIONS:
--help, -h show help (default: false)