- fun gen [ts|go]:AST 扫描 BindService* 调用,临时生成 go test 辅助采集, 经 fun v1.3.7 公开 API 生成,产物与内置 GenCode 字节级一致(回归测试锁定) - fun run:热更新开发循环,先编译成功再切换,失败保留旧进程 - fun docs:浅色标准文档站——参数表/State 添加字段/请求 JSON 可编辑/ 响应格式化/NDJSON 流式逐行展示,反向代理 /cell 同源无 CORS - 元数据:TS 产物两遍解析重建(枚举/可空/流式工厂/嵌套引用全支持) - 纯标准库实现,零第三方依赖
2.9 KiB
2.9 KiB
fun-cli
fun 框架的配套命令行工具。不修改 fun 框架任何一行,
兼容 v1.3.7+;纯 Go 标准库实现,go install 即用。
安装
go install github.com/cyi-cc/fun-cli@latest
工作原理(为什么 fun 可以零改动)
fun 的服务注册全在 BindService/BindServiceForGen 调用里。fun-cli 用 AST 扫描定位
这些调用(支持 &pkg.Svc{}、同包 &Svc{}、for _, x := range []any{...} 循环注册),
在被调用包目录临时生成一个 go test 辅助文件——测试文件天然能访问包内类型
(服务定义在 package main 也不怕)——执行后立即删除。生成由 fun 公开的
BindServiceForGen + SetOutput + GenCode 完成,产物与内置生成器完全一致。
三个命令
fun gen —— 生成客户端代码
fun gen # Go + TS → ./gen
fun gen ts # 只生成 TypeScript
fun gen go # 只生成 Go
fun gen ts -o ./frontend/src/api
fun gen -from meta.json # 直接渲染元数据 JSON(CI 友好)
fun run —— 热更新
fun run # 改 .go/go.mod/go.sum 自动重编译重启
fun run -p ./cmd/server
fun run -- -config dev.yaml # 透传程序参数
先编译成功再切换进程;编译失败保留旧进程。Ctrl+C 连子进程一起退出。
fun docs —— API 文档站
fun docs # 自动 go run . 拉起后端
fun docs -upstream http://127.0.0.1:9000 # 指定后端地址
fun docs -no-run # 后端已在别处运行
- 浅色标准文档风格:侧栏服务/方法树(stream/void 徽标)+ 搜索
- 参数表:字段/类型/示例值/说明;枚举下拉、嵌套 DTO 分层、可空标注
- 请求:表单实时生成 JSON,可直接编辑后发送
- State:"添加字段"式键值编辑(存 localStorage),值注入请求
state对象—— 键以后端 Guard 读取为准,前端只负责填值 - 响应:格式化 JSON;NDJSON 流式方法逐行实时追加
- 文档站反向代理
/cell到后端,同源无 CORS 问题
元数据 JSON
fun docs -from/fun gen -from 消费的元数据格式(由 TS 产物解析重建):
{"services":[{"name":"userSvc","methods":[
{"name":"login","dto":{"kind":"struct","name":"loginDto","fields":[
{"name":"email","type":{"kind":"string","name":"string"}}]}},
"returns":{"kind":"string","name":"string"}}]}]}
已知边界
- fun v1.3.7 的 TS 模板对流式+DTO 方法会生成
dto: dto:X的双前缀类型 (框架自身的模板怪癖)。fun-cli 的文档站解析已兼容;生成的 TS 文件如需编译, 该怪癖仍随产物保留——按"fun 零改动"约定不去修它。
开发
go test ./... # 渲染回归 + 解析回环 + node 门控的 TS 客户端行为测试