FilesCodeBox 契约层:错误码 + Thrift 生成的 API 类型。纯类型、零业务依赖,是前后端与所有实现方(backend core、fnos 等)的单一真相源。
🗂️ FilesCodeBox 生态成员仓 · 总览见 装配仓 filescodebox · 架构图集
| 目录 | 说明 |
|---|---|
errcode/ |
全站统一业务码(码段规划见文件头注释) |
gen/ |
由 idl/*.thrift 生成的纯模型类型(Thrift v0.13 工具链) |
gen/ts/ |
由 IDL 生成的 TypeScript 类型声明(cmd/gen-ts,供前端 npm 依赖) |
openapi/ |
由 IDL 生成的 OpenAPI 3.0 规范(cmd/gen-openapi,core go:embed 服务于 /openapi.json) |
idl/ |
Thrift IDL 源(单一真相源,与 gen/ 同仓演进) |
cmd/ |
自包含生成器:gen-openapi / gen-ts(纯 Go,零外部工具链) |
- 本模块不允许 import 任何项目内包,仅依赖 thrift runtime 与标准库。
- 任何破坏性变更(删除/改名字段、改错误码语义)视为 不兼容变更,必须升主版本。
IDL 源(idl/)与生成产物(gen/)都在本仓内,自包含再生成:
./scripts/install-tools.sh # 首次:安装 hz v0.9.7 + thriftgo v0.4.3(与既有产物一致)
./scripts/gen-model.sh # 从 idl/*.thrift 全量再生成 gen/<domain>/
CHECK=1 ./scripts/gen-model.sh # 只校验 gen/ 与 idl/ 是否同步(CI 可用)OpenAPI 规范与 TS 类型是纯 Go 生成器,无需安装工具链:
go run ./cmd/gen-openapi # 再生成 openapi/openapi.json(--check 只校验)
go run ./cmd/gen-ts # 再生成 gen/ts/*.d.ts(--check 只校验)历史说明: 生成曾依赖旧单体仓库 FileCodeBox/backend 的
make gen+ 手工拷贝, 现已内聚到本仓(idl/ 与生成脚本于 2026-10 自单体迁入)。
import (
"github.com/filescodebox/contracts/errcode"
"github.com/filescodebox/contracts/gen/share"
)下游 go.mod 无需任何 replace:thrift 版本约束以 require 形式从本模块传递。
gen/ts/ 是从同一份 IDL 生成的纯类型声明(零 runtime)。打 v* tag 时 Release
工作流自动把类型包成 npm tgz 挂到本仓 Release(filescodebox-contracts-<ver>.tgz,
版本与 tag 对齐),前端以 Release 资产 URL 直接依赖——匿名 https,Docker/CI
构建免 git 免 npm registry,版本钉定与 tag 严格一致:
import type { share, admin } from '@filescodebox/contracts';
type Detail = share.ShareDetail;
const req: admin.AdminListFilesReq = { /* ... */ };不用 npm git 依赖的原因:npm 对 github 简写依赖恒以
git+ssh解析记录进 lockfile,容器内npm ci无 SSH key 必挂;Release 资产是纯 https 下载,无此坑。
约定:
- 域 =
namespace go名,每域一个gen/ts/<domain>.d.ts;顶层入口index.d.ts以export type * as <domain>命名空间导出——跨域同名类型 (如BaseConfig/EmptyReq)由命名空间隔离,勿改为顶层export *。 - 字段名与线上 JSON 序列化名一致(优先
api.*注解值);optional→?:;map<K,V>→Record<string, V>(JSON object 键恒为字符串);i64→number(现网值域远低于 2^53)。 - 改 IDL 后:
go run ./cmd/gen-ts再生成并提交,CI--check守卫同步;cmd/gen-ts的测试会与openapi.json做类型名单对账,防两侧漂移。 - 发版 = 打 tag(工作流自动对齐
package.jsonversion 并发 tgz 资产), 前端升级 = 换 package.json 里的资产 URL 版本号。