gocanned

module
v0.0.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 21, 2026 License: MIT

README

gocanned

Go Web 应用基础设施库,提供配置管理、日志、数据库、缓存、限流、数据库迁移、CLI 脚手架等通用组件。

安装

作为库引入

在消费方项目中添加 replace 指令指向本地路径:

cd your-project
go get github.com/CuratorC/gocanned

go.mod 中添加 replace 指令:

replace github.com/CuratorC/gocanned => ../gocanned
安装脚手架 CLI
# 从 gocanned 项目根目录执行
go install ./cmd/gocanned/

# 安装后可在任意目录使用
gocanned init myapp

安装后二进制位于 $GOPATH/bin/gocanned(通常为 ~/go/bin/gocanned),确保该路径在 PATH 中。

快速开始

创建项目
gocanned init myapp

# 如果需要覆盖已有文件
gocanned init myapp --force
启动项目
cd myapp
go mod tidy
go run main.go serve

项目默认监听 3000 端口,访问 http://localhost:3000/health-check 验证服务是否启动。

生成的项目结构

myapp/
├── main.go                              # 入口:Cobra 根命令
├── .env                                 # APP_ENV=local
├── go.mod                               # 含 replace gocanned 指令
├── bootstrap/                           # 初始化编排层
│   ├── bootstrap.go                     # SetupCommand / NewApp
│   ├── config.go                        # blank import 触发 config 和 migrations
│   ├── logger.go                        # logger.SetupLogger
│   ├── cache.go                         # cache.SetupRedis
│   ├── database.go                      # database.Connect
│   └── route.go                         # 全局中间件 + 路由注册 + 404
├── config/                              # 配置注册文件
│   ├── app.go                           # config.Add("app", ...)
│   ├── log.go                           # config.Add("log", ...)
│   ├── database.go                      # config.Add("database", ...)
│   └── redis.go                         # config.Add("redis", ...)
├── cmd/
│   └── serve.go                         # serve 子命令(优雅关停 + pprof)
├── internal/
│   ├── app/app.go                       # App 依赖注入结构体
│   ├── enum/database.go                 # DatabaseName 枚举
│   ├── http/middleware/                  # Gin 中间件
│   │   ├── logger.go                    # 请求日志
│   │   ├── recovery.go                  # Panic 恢复
│   │   └── limit.go                     # IP/路由 限流
│   ├── http/response/response.go        # 统一响应处理
│   ├── database/migrations/main/        # 数据库迁移文件
│   └── route/api.go                     # API 路由注册

配置管理

所有配置通过 .env 文件管理,配置键定义在 config/ 目录的 init() 函数中:

# .env
APP_ENV=local

配置值通过 config.Env("ENV_VAR", defaultValue) 绑定环境变量,通过点分路径读取:

config.GetString("app.port")         // "3000"
config.GetString("database.main.host") // "127.0.0.1"
config.GetInt("database.main.port")    // 3306

使用 --env 标志加载不同环境配置:

go run main.go serve --env=testing    # 加载 .env.testing
生成配置文件
go run main.go init                        # 生成全部预设模块
go run main.go init app redis              # 只生成指定模块
go run main.go init --force app            # 强制覆盖

数据库迁移

# 生成迁移文件
go run main.go migrate:make create_users --database=main

# 执行迁移
go run main.go migrate
go run main.go migrate --database=main

# 回滚最后一批
go run main.go migrate:rollback

# 查看状态
go run main.go migrate:status

迁移文件存放在 internal/database/migrations/{数据源}/ 下:

// internal/database/migrations/main/20260413_150000_create_users.go
package migrations

import "github.com/CuratorC/gocanned/migration"

func init() {
    migration.Register("main", &CreateUsers{})
}

type CreateUsers struct{}

func (m *CreateUsers) Up() string {
    return `
        CREATE TABLE users (
            id INTEGER PRIMARY KEY AUTOINCREMENT,
            name TEXT NOT NULL DEFAULT '',
            email TEXT NOT NULL DEFAULT '',
            created_at DATETIME,
            updated_at DATETIME
        )
    `
}

func (m *CreateUsers) Down() string {
    return `DROP TABLE IF EXISTS users`
}

子命令

命令 说明
serve 启动 Web 服务(默认命令)
init [module...] 生成配置注册文件
migrate 执行数据库迁移
migrate:rollback 回滚最后一批迁移
migrate:status 查看迁移状态
migrate:make <name> 生成迁移文件

依赖注入

生成的项目使用 internal/app.App 结构体实现依赖注入:

// bootstrap/bootstrap.go
func NewApp() (*app.App, error) {
    application := &app.App{}
    db, err := SetupDatabase(enum.DatabaseNameMain)
    application.DB = db
    return application, nil
}

// cmd/serve.go
application, err := bootstrap.NewApp()
bootstrap.SetupRoute(router, application)  // 将 app 传入路由层

全局标志

标志 说明
--env, -e 指定环境,加载对应的 .env.{env} 文件

打包发布

# 编译脚手架工具
go build -o gocanned ./cmd/gocanned/

# 编译库(验证无编译错误)
go build ./...

# 运行测试
go test ./...

Directories

Path Synopsis
cmd
Package cmd 存放程序的所有子命令
Package cmd 存放程序的所有子命令
gocanned command
Package limiter 处理限流逻辑
Package limiter 处理限流逻辑
Package logger logger/console_encoder.go
Package logger logger/console_encoder.go
Package migration 数据库迁移模块 参考 Laravel migration 功能,支持多数据源分组、MySQL 和 SQLite
Package migration 数据库迁移模块 参考 Laravel migration 功能,支持多数据源分组、MySQL 和 SQLite

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL