自动生成 go sdk
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
gen/
|
||||||
86
Makefile
Normal file
86
Makefile
Normal 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 - 显示此帮助信息"
|
||||||
19
README.md
19
README.md
@@ -8,21 +8,28 @@
|
|||||||
|
|
||||||
```
|
```
|
||||||
proto/
|
proto/
|
||||||
├── README.md
|
├── .gitignore # Git忽略配置文件
|
||||||
├── buf.yaml
|
├── Makefile # 构建和发布脚本
|
||||||
└── shenxianhe/
|
├── README.md # 项目说明文档
|
||||||
└── v1/
|
├── src/ # 服务定义目录
|
||||||
└── account.proto # 账户服务接口定义
|
├── buf.gen.yaml # buf生成配置
|
||||||
|
├── buf.yaml # buf项目配置
|
||||||
|
├── script/ # 辅助脚本目录
|
||||||
|
├── templates/ # 模板文件目录
|
||||||
|
└── version.txt # 版本号文件
|
||||||
```
|
```
|
||||||
|
|
||||||
## 使用指南
|
## 使用指南
|
||||||
|
|
||||||
### 安装依赖
|
### 安装依赖
|
||||||
|
|
||||||
本项目使用 [Buf](https://buf.build/) 进行 Protocol Buffers 的管理和构建。请先安装 Buf:
|
本项目使用多个工具进行 Protocol Buffers 的管理、构建和代码生成。请安装以下工具:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
go install github.com/bufbuild/buf/cmd/buf@latest
|
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
8
buf.gen.yaml
Normal 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
|
||||||
2
buf.yaml
2
buf.yaml
@@ -1,5 +1,7 @@
|
|||||||
# For details on buf.yaml configuration, visit https://buf.build/docs/configuration/v2/buf-yaml
|
# For details on buf.yaml configuration, visit https://buf.build/docs/configuration/v2/buf-yaml
|
||||||
version: v2
|
version: v2
|
||||||
|
modules:
|
||||||
|
- path: src
|
||||||
lint:
|
lint:
|
||||||
use:
|
use:
|
||||||
- STANDARD
|
- STANDARD
|
||||||
|
|||||||
34
script/get_next_version.sh
Executable file
34
script/get_next_version.sh
Executable 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
97
script/publish-git.sh
Executable 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
38
script/test_version_script.sh
Executable 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
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
syntax = "proto3";
|
syntax = "proto3";
|
||||||
package shenxianhe.v1;
|
package account.v1;
|
||||||
option go_package = "shenxianhe/gen/shenxianhe/v1;shenxianhev1";
|
option go_package = "git.0yue.com/shenxianhe/sdk/account/v1;accountv1";
|
||||||
|
|
||||||
// 认证类型枚举
|
// 认证类型枚举
|
||||||
enum AuthenticationType {
|
enum AuthenticationType {
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
syntax = "proto3";
|
syntax = "proto3";
|
||||||
package shenxianhe.v1;
|
package notification.v1;
|
||||||
option go_package = "shenxianhe/gen/shenxianhe/v1;shenxianhev1";
|
option go_package = "git.0yue.com/shenxianhe/sdk/notification/v1;notificationv1";
|
||||||
|
|
||||||
message SendSMSRequest {
|
message SendSMSRequest {
|
||||||
string phone = 1;
|
string phone = 1;
|
||||||
69
templates/go-sdk-readme.md
Normal file
69
templates/go-sdk-readme.md
Normal 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
1
version.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
1.2.0
|
||||||
Reference in New Issue
Block a user