# BSM Infra Full BSM 后端服务的 Go workspace,包含基础能力、电商、财务、社交服务,以及可选择组件运行的单体入口。所有模块统一使用 **Go 1.26.5**。 ## 目录结构 | 目录 | 服务 | | --- | --- | | `module/base` | ads、cloud、cms、feedback、fts、initial、logs、mgt、passport、sender | | `module/ec` | address、delivery、mall、market、order | | `module/finance` | wallet | | `module/social` | feed、group、relation | | `protobuf` | 跨服务共享的 protobuf 定义,目前包含 `blocks.proto` | | `cmd` | 聚合上述服务的单体启动器 | | `go.work` | 21 个 Go 模块的 workspace 定义 | 各服务的接口、配置和部署细节见对应 `module/**/README.md`。 ## 环境要求 - Go 1.26.5 - Git - 按所运行服务准备 PostgreSQL、Redis、etcd、MQ 或对象存储等外部依赖 - 重新生成 protobuf 时,需要在系统 `PATH` 中安装 `protoc`、`protoc-gen-go`、`protoc-gen-go-grpc` 和 `protoc-gen-grpc-gateway` 确认工具链: ```bash go version go work sync ``` 统一重新生成 protobuf: ```bash bash scripts/generate-protobuf.sh ``` 脚本以根目录 `protobuf/blocks.proto` 为共享定义,并为各服务生成 protobuf、gRPC 和 grpc-gateway 代码。生成后的兼容别名继续保留旧模块中的公共类型名。 更新所有 workspace 模块的依赖: ```bash bash scripts/update-all.sh ``` 脚本会为每个模块执行 `go get -u ./...` 和 `go mod tidy`,最后运行 `go work sync`;它不会自动提交或推送 Git 变更。 编译全部 19 个独立服务: ```bash bash scripts/build-all-linux.sh ``` 脚本固定交叉编译 Linux x86-64(`GOOS=linux`、`GOARCH=amd64`、`CGO_ENABLED=0`),产物写入 `.builds/<领域>-<模块>`。全部模块编译成功后,各模块的 `etc/*_prod.yaml` 会复制到 `.builds/etc/`。`.builds/` 已加入 `.gitignore`,聚合入口 `cmd` 不包含在批量构建中。 ## 配置 每个服务的 `etc/` 目录包含 `*_dev.yaml`、`*_test.yaml` 和 `*_prod.yaml` 示例。提交到仓库的配置只能包含占位值;请在本地副本或部署系统的密钥管理中注入真实凭据,不要提交数据库密码、访问密钥、令牌或私钥。 本仓库审计时已移除过明文凭据。如果这些凭据曾在真实环境使用,应立即在数据库、SMTP、对象存储及相关服务侧轮换。 ## 运行 运行单个服务时,进入其模块目录。例如: ```bash cd module/base/passport go run ./cmd/main ``` 运行聚合入口: ```bash cd cmd go run ./main ``` 默认启动全部可聚合组件。通过 `BSM_SERVICES` 选择服务,名称以逗号分隔: ```bash # Linux/macOS BSM_SERVICES=passport,order,wallet go run ./main # PowerShell $env:BSM_SERVICES = "passport,order,wallet" go run ./main ``` 可选组件为:`ads`、`cloud`、`cms`、`feedback`、`fts`、`initial`、`logs`、`mgt`、`passport`、`sender`、`address`、`delivery`、`mall`、`market`、`order`、`wallet`。社交服务目前作为独立模块运行,尚未接入聚合入口。 ## 测试 根目录不是 Go module,因此不要在根目录执行 `go test ./...`。应逐 workspace 模块测试。 PowerShell: ```powershell go list -m -f '{{.Dir}}' | ForEach-Object { Push-Location $_ try { go test ./... } finally { Pop-Location } } ``` Linux/macOS: ```bash go list -m -f '{{.Dir}}' | while IFS= read -r module; do (cd "$module" && go test ./...) done ``` 依赖运行中服务或真实基础设施的测试带有 `integration` build tag,默认测试不会访问外部系统。准备好测试环境和对应的 `BSM_*_TOKEN` 等变量后,在目标模块显式运行: ```bash go test -tags=integration ./... ``` 建议提交前执行: ```bash gofmt -w . go vet ./... go test ./... ``` 最后两条命令需在每个模块目录执行,可使用上面的 workspace 循环。 ## 开发约定 - Go 版本声明、Docker 构建镜像和 CI 构建镜像统一为 `1.26.5`。 - 新模块必须加入 `go.work`,并确保本地 `replace` 使用当前 `module/...` 目录结构。 - protobuf 描述符必须包含服务命名空间,避免多个服务聚合到同一进程时发生全局文件名冲突。 - 外部依赖测试使用 `//go:build integration`,不得让默认测试依赖网络或已启动服务。 - 配置和测试数据中不得包含真实凭据或个人信息。