8.7 KiB
go-omni CLI
首次接入见 README,无需克隆框架源码。本页说明命令参数;下方 go run ./cmd/go-omni 示例在框架仓库中执行,并显式引用本地源码。
API 契约驱动项目
# 创建包含可运行问候接口的新项目
go run ./cmd/go-omni api new --module example.com/demo --framework-dir . ../demo
# 从已有定义生成对应目录、类型、路由和业务骨架
go run ./cmd/go-omni api generate --api examples/contracts/user.api \
--dir ../userService --module example.com/userService --framework-dir .
# 校验定义;也接受 goctl 风格的 api go -api ... -dir ...
go run ./cmd/go-omni api validate --api examples/contracts/user.api
new --api <file> 是契约项目的另一个入口。可以组合 --database mysql --storage local --log-output file,生成配置、依赖初始化与资源关闭。API 默认无数据库、无对象存储;--database memory 等同于不打开连接。--force 不允许覆盖 API 项目。初始配置选择写入 manifest,重新生成自动沿用。
后续在生成项目内执行 go-omni api generate --api api/user.api --dir .。
项目内可省略 --api / --dir。api inspect 展示路由和鉴权/业务错误,api export 向 stdout 导出 OpenAPI,api generate --dry-run 预览文件变化。--check 只读检查生成产物是否过期。生成器记录所有权,保留 Service / Repository / 配置 / main 的手写内容,遇到生成文件被手动修改则报冲突。新 Service 与中间件占位实现返回 501。支持 error (...)、具名 auth、路由 @errors / @auth 和多行 @doc;错误目录同步生成 internal/apierrors 调用函数。
v0.10.0-preview 新增 errorCatalog:集中配置业务码、提示和 HTTP 状态,支持默认 HTTP 200 与单条覆盖,生成函数、路由策略和 OpenAPI 共用一份定义。语法及配置方式见 统一错误目录。
支持范围、参数语义、目录及安全更新策略见 API 开发指南。本版借鉴 go-zero 的工作流,不宣称兼容全部 goctl 语法;仍通过 Omni/httpx 保留网络层替换能力。
日志与对象存储按需装配
新增 --log-output stdout|stderr|file、--log-format json|text、--storage none|local|s3|r2|oss。
指定任意一个新选项后,生成严格的配置文件、初始化代码和项目自身的测试;不指定则保留原有轻量骨架。
对象存储独立于 --database memory|mysql。只有选择文件存储才会生成文件 Handler / Service 和对应适配器。
开发阶段可以使用本地源码;固定远程版本的安装和验收见 发布说明:
# 在 go-omni 仓库中运行;目标目录须为空。
go run ./cmd/go-omni new --framework-dir . \
--module example.com/fileService --log-output file --log-format json \
--storage local ../fileService
生成项目包含 etc/config.yaml、internal/settings、internal/servicecontext/storage.go、
文件 Service/Handler、测试和 MODULES.md。按生成的 MODULES.md 配置示例 Token 和本地签名密钥后,
go mod tidy && go run ./cmd/server 即可体验。云存储分别选择 --storage s3、r2、oss,
再设置已有桶/凭据等环境变量;不自动创建桶或修改云资源。
配置优先级为默认值 → YAML/JSON → 环境变量;密钥仅允许环境变量。Service 依赖统一存储接口, 组合处负责创建客户端与有界连接池,退出时关闭自己创建的资源。文件接口提供服务端上传、直传签名、 临时下载链接及统一错误处理;日志示例携带 requestId,文件输出默认带轮转。没有固定业务身份上下文。
新模板要求 v0.7.0-preview 或更新版本;明确指定旧版本并启用新模块会被拒绝,
避免模板引用旧框架不存在的接口。本地 --framework-dir 验证不受此限制。--force 可重新生成兼容配置,
但如果切换配置会遗留引用已移除依赖的旧文件,则拒绝操作,要求使用新目录;不会自动删除修改过的代码。
验证当前生成器:
GO_OMNI_SCAFFOLD_INTEGRATION=1 go test -race ./cmd/go-omni/...
python3 scripts/verifyScaffoldModules.py
前者覆盖两种数据库与五种文件存储选择、日志方式/格式,以及生成项目的配置、资源关闭和接口测试。 后者实际编译启动服务,验证日志、上传/下载/直传链接、错误状态、nethttp/native 下的 SIGINT/SIGTERM 和监听端口释放。 云端选项的测试使用本地替身,不代表 OSS/R2 实网验收;本批不访问业务服务器。报告见 脚手架模块验收。
其他命令与远程安装
main 分支还提供 go-omni add orderItems --dir /path/to/project,向已有 GoOmni 项目增加
Handler / Service / Repository / Model 与模块注册入口。模块名为 lowerCamelCase,
目标目录存在时拒绝覆盖,已有启动代码保持原样。生成模块带可替换的内存 CRUD Repository,
导入后使用 orderItems.Register(application, repository, authMiddleware) 注册。
该命令从 v0.7.0-preview 提供;源码可用 go build -o /tmp/go-omni ./cmd/go-omni 构建。
边界和验证方式见 业务基础模块。
从远程安装,生成一个带 Handler / Service / Repository / Model 分层的服务骨架:
GOPRIVATE=git.yuntuo.hk go install git.yuntuo.hk/k2safe/go-omni/cmd/go-omni@v0.10.0-preview
go-omni new --framework-version v0.10.0-preview --module example.com/billing ./billing
cd billing
go mod tidy
go run ./cmd/server
通过 go install ...@版本 安装的 CLI 从构建信息中读取版本,并把它固定到生成项目的
go.mod。不会使用不存在的 v0.0.0,也不会在普通业务目录中添加本地 replace。
需要选择其他已发布版本时,使用完整版本号:
go-omni new --framework-version v0.6.0-preview --module example.com/billing ./billing
--framework-version 禁用自动本地替换;main、latest 等浮动引用不接受为固定版本。
源码构建的 CLI 使用代码中声明的目标发布版本;该版本未发布时请显式选择已发布版本,或用 --framework-dir 验证本地源码。
在 GoOmni 源码目录执行时,命令会自动在生成项目的 go.mod 中加入本地
replace git.yuntuo.hk/k2safe/go-omni => ...,便于立即运行和测试。目标目录非空时命令会停止,明确传入
--force 才会覆盖脚手架文件。
也可以在任意目录显式指定源码路径:
go-omni new --framework-dir /path/to/go-omni --module example.com/billing ./billing
默认生成内存存储版本;选择 MySQL 时:
go-omni new --database mysql --module example.com/billing ./billing
MySQL 项目额外包含 schema.sql、MySQL Repository 和可选的数据库集成测试。
先应用建表脚本,再设置 GO_OMNI_DB_DSN 启动。ServiceContext 负责连接池初始化、表结构检查、
就绪探针注册和关闭。两种模式都提供用户 CRUD、分页、输入校验和统一错误响应。
生成服务默认包含 /health/live、/health/ready 和示例 /users CRUD。
退出信号通过 signal.NotifyContext 传入 RunContext,Logger 的关闭函数注册到应用生命周期。
发布验收使用 Python 3 标准库脚本,不需要额外 Python 依赖:
python3 scripts/verifyScaffold.py --version v0.6.0-preview
python3 scripts/verifyDatabase.py --version v0.6.0-preview
脚本在源码目录外安装远程 CLI、生成项目,确认固定版本且没有 replace,再下载依赖、
编译、请求接口,并对真实二进制分别发送 SIGINT 和 SIGTERM。同时验证框架 Run 的
信号处理和清理回调。每个进程都必须退出码为 0、释放监听端口;临时项目和测试进程会被清理。
发布前验证当前源码:
go build -o /tmp/go-omni ./cmd/go-omni
python3 scripts/verifyScaffold.py --cli /tmp/go-omni --framework-dir .
python3 scripts/verifyDatabase.py --cli /tmp/go-omni --framework-dir .
数据库验收需要本地 Docker,使用独立 MySQL 8.4 容器;不会连接已有业务数据库,结束后清理测试容器与数据卷。
显式迁移(main)
SQL 命名为 0001_createUsers.up.sql。先预览版本和 SHA-256 清单:
go-omni migrate --dir migrations
部署步骤配置 GO_OMNI_DB_DSN,显式执行:
go-omni migrate --dir migrations --apply
预览不连接数据库;应用启动不自动迁移。失败保留 dirty 状态,不提供自动 down/force。
脚手架原有 schema.sql 不会自动变成有版本的迁移,已有库需要先确定基线。详见 扩展模块。