自动生成 go sdk

This commit is contained in:
sky
2025-08-20 22:37:07 +08:00
parent f6207946ee
commit cfde112832
12 changed files with 353 additions and 10 deletions

1
.gitignore vendored Normal file
View File

@@ -0,0 +1 @@
gen/

86
Makefile Normal file
View File

@@ -0,0 +1,86 @@
# Makefile for generating protobuf files
# 设置变量
BUF := buf
GEN_DIR := gen
GO_MOD := git.0yue.com/shenxianhe/sdk
GO_SDK_REPO := https://git.0yue.com/shenxianhe/sdk.git
# 默认目标 - 显示帮助信息
.DEFAULT_GOAL := help
# 生成pb文件的主目标 - 包含公共处理部分和各语言私有处理部分
.PHONY: generate
generate: common-gen language-gen
# 公共处理部分
.PHONY: common-gen
common-gen: lint clean generate-pb
# 语言特定处理部分目前只有go
.PHONY: language-gen
language-gen: init-go generate-go-readme
# 执行buf lint检查
.PHONY: lint
lint:
@echo "运行buf lint检查..."
$(BUF) lint
# 清理gen目录
.PHONY: clean
clean:
@echo "清理$(GEN_DIR)目录..."
@if [ -d "$(GEN_DIR)" ]; then rm -rf $(GEN_DIR); fi
# 执行buf generate生成pb文件
.PHONY: generate-pb
generate-pb:
@echo "生成protobuf文件..."
$(BUF) generate
# Go语言特定初始化
.PHONY: init-go
init-go:
@echo "$(GEN_DIR)/go目录初始化go module..."
cd $(GEN_DIR)/go && go mod init $(GO_MOD) && go mod tidy
# 发布命令 - 目前只处理go语言
.PHONY: publish
publish:
@echo "开始发布流程..."
# 确保版本号管理脚本可执行
@chmod +x script/get_next_version.sh
# 调用版本号管理脚本获取新版本号
@echo "正在生成新版本号..."
@script/get_next_version.sh
# 调用各个语言的发布目标
@$(MAKE) publish-go
# Go语言代码发布子命令
.PHONY: publish-go
publish-go: generate
@echo "发布生成的代码到 $(GO_SDK_REPO)..."
# 确保git发布脚本可执行并调用git发布脚本内部会自己获取版本号
chmod +x script/publish-git.sh && script/publish-git.sh "$(GO_SDK_REPO)" "$(GEN_DIR)/go"
# 生成Go SDK的README文件
.PHONY: generate-go-readme
generate-go-readme:
@echo "生成Go SDK的README文件..."
@mkdir -p $(GEN_DIR)/go
@cp templates/go-sdk-readme.md $(GEN_DIR)/go/README.md
# 帮助信息
.PHONY: help
help:
@echo "可用的目标:"
@echo " generate - 生成 protobuf 文件"
@echo " lint - 运行 $(BUF) lint 检查 proto 文件是否有问题"
@echo " clean - 删除 $(GEN_DIR) 目录"
@echo " generate-pb - 使用 $(BUF) generate 生成 protobuf 文件"
@echo " init-go - 在 $(GEN_DIR)/go 目录初始化go module"
@echo " generate-go-readme - 生成Go SDK的README文件包含使用示例和版本说明"
@echo " publish - 发布生成的 protobuf 代码"
@echo " publish-go - 发布go语言代码到 $(GO_SDK_REPO) 仓库并自动打tag"
@echo " help - 显示此帮助信息"

View File

@@ -8,21 +8,28 @@
```
proto/
├── README.md
├── buf.yaml
── shenxianhe/
└── v1/
└── account.proto # 账户服务接口定义
├── .gitignore # Git忽略配置文件
├── Makefile # 构建和发布脚本
── README.md # 项目说明文档
├── src/ # 服务定义目录
├── buf.gen.yaml # buf生成配置
├── buf.yaml # buf项目配置
├── script/ # 辅助脚本目录
├── templates/ # 模板文件目录
└── version.txt # 版本号文件
```
## 使用指南
### 安装依赖
本项目使用 [Buf](https://buf.build/) 进行 Protocol Buffers 的管理构建。请安装 Buf
本项目使用多个工具进行 Protocol Buffers 的管理构建和代码生成。请安装以下工具
```bash
go install github.com/bufbuild/buf/cmd/buf@latest
go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install connectrpc.com/connect/cmd/protoc-gen-connect-go@latest
```
### 检查语法

8
buf.gen.yaml Normal file
View File

@@ -0,0 +1,8 @@
version: v2
plugins:
- local: protoc-gen-go
out: gen/go
opt: paths=source_relative
- local: protoc-gen-connect-go
out: gen/go
opt: paths=source_relative

View File

@@ -1,5 +1,7 @@
# For details on buf.yaml configuration, visit https://buf.build/docs/configuration/v2/buf-yaml
version: v2
modules:
- path: src
lint:
use:
- STANDARD

34
script/get_next_version.sh Executable file
View File

@@ -0,0 +1,34 @@
#!/bin/bash
# 版本号管理脚本:负责生成并返回下一个版本号
# 递增规则每次递增MINOR位重置PATCH位为0
# 获取proto根目录
ROOT_DIR=$(dirname "$(dirname "$0")")
# 确保version.txt文件存在并设置默认值
if [ ! -f "$ROOT_DIR/version.txt" ]; then
echo "1.0.0" > "$ROOT_DIR/version.txt"
echo "警告version.txt文件不存在已创建并设置默认值1.0.0"
fi
# 读取当前版本号
CURRENT_VERSION=$(cat "$ROOT_DIR/version.txt")
# 解析版本号的MAJOR、MINOR和PATCH部分
MAJOR=$(echo $CURRENT_VERSION | cut -d. -f1)
MINOR=$(echo $CURRENT_VERSION | cut -d. -f2)
PATCH=$(echo $CURRENT_VERSION | cut -d. -f3)
# 递增MINOR版本号并重置PATCH为0
MINOR=$((MINOR + 1))
PATCH=0
# 生成新版本号
NEW_VERSION="$MAJOR.$MINOR.$PATCH"
# 更新version.txt文件
echo "$NEW_VERSION" > "$ROOT_DIR/version.txt"
# 输出版本号变更信息
echo "版本号已从 $CURRENT_VERSION 更新到 $NEW_VERSION"

97
script/publish-git.sh Executable file
View File

@@ -0,0 +1,97 @@
#!/bin/bash
# git操作发布脚本
# 参数1: 远程仓库URL
# 参数2: 工作目录
# 确保提供了必要的参数
if [ $# -lt 2 ]; then
echo "错误:缺少必要参数"
echo "用法:$0 <远程仓库URL> <工作目录>"
exit 1
fi
REMOTE_REPO="$1"
WORK_DIR="$2"
# 获取版本号
echo "正在获取版本号..."
# 返回proto根目录获取version.txt
ROOT_DIR=$(dirname "$(dirname "$0")")
NEW_VERSION=$(cat "$ROOT_DIR/version.txt")
NEW_TAG="v$NEW_VERSION"
echo "使用的版本号: $NEW_TAG"
# 创建临时目录用于克隆仓库
TEMP_DIR=$(mktemp -d)
echo "创建临时目录: $TEMP_DIR"
# 清理函数,确保临时目录被删除
trap "rm -rf \"$TEMP_DIR\"" EXIT
# 1. 在临时目录克隆远程仓库,只获取.git目录
echo "在临时目录克隆远程仓库..."
git clone --no-checkout "$REMOTE_REPO" "$TEMP_DIR"
# 2. 确保工作目录存在
if [ ! -d "$WORK_DIR" ]; then
echo "创建工作目录: $WORK_DIR"
mkdir -p "$WORK_DIR"
fi
# 3. 复制.git目录到工作目录
# 先删除工作目录中可能存在的.git目录
if [ -d "$WORK_DIR/.git" ]; then
echo "删除工作目录中已有的.git目录..."
rm -rf "$WORK_DIR/.git"
fi
echo "将.git目录复制到工作目录..."
cp -a "$TEMP_DIR/.git" "$WORK_DIR/"
# 4. 切换到工作目录
cd "$WORK_DIR"
# 5. 添加所有文件
echo "添加文件..."
git add .
# 6. 检查是否有更改需要提交
if ! git diff --cached --exit-code > /dev/null; then
echo "提交更改..."
git commit -m "自动生成 protobuf 代码 (tag: $NEW_TAG)"
else
echo "没有更改需要提交,创建空提交..."
git commit --allow-empty -m "自动生成 protobuf 代码 (tag: $NEW_TAG)"
fi
# 7. 如果标签已存在,先删除
if git rev-parse --verify "$NEW_TAG" > /dev/null 2>&1; then
echo "标签 $NEW_TAG 已存在,先删除..."
git tag -d "$NEW_TAG"
# 同时删除远程标签
git push origin :refs/tags/"$NEW_TAG"
fi
# 8. 创建新标签
echo "创建标签..."
git tag "$NEW_TAG"
# 9. 推送标签和分支
echo "推送标签和分支..."
# 先推送标签
git push origin "$NEW_TAG"
if [ $? -ne 0 ]; then
echo "错误:标签推送失败"
exit 1
fi
# 再推送分支
git push origin main
if [ $? -ne 0 ]; then
echo "警告:分支推送失败,请检查远程仓库状态"
echo "标签 $NEW_TAG 已成功发布到仓库 $REMOTE_REPO"
else
echo "成功发布版本 $NEW_TAG 和分支到仓库 $REMOTE_REPO"
fi

38
script/test_version_script.sh Executable file
View File

@@ -0,0 +1,38 @@
#!/bin/bash
# 测试版本号管理脚本
# 设置测试环境
echo "设置测试环境..."
TEST_VERSION="1.0.0"
echo "$TEST_VERSION" > version.txt
# 显示初始版本号
echo "初始版本号: $(cat version.txt)"
# 测试独立脚本
chmod +x get_next_version.sh
# 运行get_next_version.sh脚本
echo -e "\n运行版本号管理脚本..."
NEW_TAG=$(./get_next_version.sh)
# 显示更新后的版本号
echo -e "\n更新后的版本号: $(cat version.txt)"
# 验证版本号是否正确递增
expected_version="1.1.0"
actual_version=$(cat version.txt)
echo -e "\n测试结果"
if [ "$actual_version" = "$expected_version" ]; then
echo "✅ 版本号递增测试通过!"
echo "成功将版本从 $TEST_VERSION 更新到 $actual_version"
echo "生成的git tag: $NEW_TAG"
else
echo "❌ 版本号递增测试失败!"
echo "期望版本: $expected_version, 实际版本: $actual_version"
fi
# 清理测试环境
echo "$TEST_VERSION" > version.txt

View File

@@ -1,6 +1,6 @@
syntax = "proto3";
package shenxianhe.v1;
option go_package = "shenxianhe/gen/shenxianhe/v1;shenxianhev1";
package account.v1;
option go_package = "git.0yue.com/shenxianhe/sdk/account/v1;accountv1";
//
enum AuthenticationType {

View File

@@ -1,6 +1,6 @@
syntax = "proto3";
package shenxianhe.v1;
option go_package = "shenxianhe/gen/shenxianhe/v1;shenxianhev1";
package notification.v1;
option go_package = "git.0yue.com/shenxianhe/sdk/notification/v1;notificationv1";
message SendSMSRequest {
string phone = 1;

View File

@@ -0,0 +1,69 @@
# Go SDK 自动生成文档
## 项目简介
这是由 protobuf 自动生成的 Go SDK用于与 shenxianhe 服务进行交互。
## SDK 版本与 API 版本的区别
**SDK 版本**
- 由 Git tag 管理,格式为 vX.Y.Z
- 表示生成的 SDK 代码的版本号
- 每次重新生成并发布代码时会自增
**API 版本**
- 体现在 proto 文件路径中,如 v1、v2 等
- 表示服务接口的版本号
- 由服务端定义和维护
两个版本号是相互独立的概念,同一 API 版本可能对应多个 SDK 版本。
## 使用示例
### 导入依赖
```go
import (
"context"
"git.0yue.com/shenxianhe/sdk/account/v1"
"git.0yue.com/shenxianhe/sdk/notification/v1"
"connectrpc.com/connect"
)
```
### 创建客户端并调用接口
```go
// 创建AccountService客户端
client := account.NewAccountServiceClient(
connect.NewHttpClient(nil),
"http://your-service-url",
)
// 调用Auth接口
resp, err := client.Auth(
context.Background(),
connect.NewRequest(&account.AuthRequest{
AuthType: account.AuthenticationType_AUTHENTICATION_TYPE_PHONE,
AuthId: "13800138000",
Credential: "123456",
}),
)
if err != nil {
// 处理错误
}
// 使用响应结果
result := resp.Msg
```
## 注意事项
- 本 SDK 由代码自动生成,请勿手动修改
- 如有任何问题,请联系服务提供方
## 版权信息
© 2025 神仙盒团队. All rights reserved.

1
version.txt Normal file
View File

@@ -0,0 +1 @@
1.2.0