From cfde1128324fed9ead5ec4ea750f0c96faec6ce1 Mon Sep 17 00:00:00 2001 From: sky Date: Wed, 20 Aug 2025 22:37:07 +0800 Subject: [PATCH] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E7=94=9F=E6=88=90=20go=20sdk?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + Makefile | 86 ++++++++++++++++ README.md | 19 ++-- buf.gen.yaml | 8 ++ buf.yaml | 2 + script/get_next_version.sh | 34 +++++++ script/publish-git.sh | 97 +++++++++++++++++++ script/test_version_script.sh | 38 ++++++++ {shenxianhe => src/account}/v1/account.proto | 4 +- .../notification}/v1/notification.proto | 4 +- templates/go-sdk-readme.md | 69 +++++++++++++ version.txt | 1 + 12 files changed, 353 insertions(+), 10 deletions(-) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 buf.gen.yaml create mode 100755 script/get_next_version.sh create mode 100755 script/publish-git.sh create mode 100755 script/test_version_script.sh rename {shenxianhe => src/account}/v1/account.proto (95%) rename {shenxianhe => src/notification}/v1/notification.proto (91%) create mode 100644 templates/go-sdk-readme.md create mode 100644 version.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6bca335 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +gen/ \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..dc3b6e0 --- /dev/null +++ b/Makefile @@ -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 - 显示此帮助信息" \ No newline at end of file diff --git a/README.md b/README.md index 02fcd48..cea5315 100644 --- a/README.md +++ b/README.md @@ -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 ``` ### 检查语法 diff --git a/buf.gen.yaml b/buf.gen.yaml new file mode 100644 index 0000000..155387d --- /dev/null +++ b/buf.gen.yaml @@ -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 diff --git a/buf.yaml b/buf.yaml index 9ff3911..123a9b2 100644 --- a/buf.yaml +++ b/buf.yaml @@ -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 diff --git a/script/get_next_version.sh b/script/get_next_version.sh new file mode 100755 index 0000000..ec290f5 --- /dev/null +++ b/script/get_next_version.sh @@ -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" \ No newline at end of file diff --git a/script/publish-git.sh b/script/publish-git.sh new file mode 100755 index 0000000..cc2ee4a --- /dev/null +++ b/script/publish-git.sh @@ -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 \ No newline at end of file diff --git a/script/test_version_script.sh b/script/test_version_script.sh new file mode 100755 index 0000000..7793d8c --- /dev/null +++ b/script/test_version_script.sh @@ -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 \ No newline at end of file diff --git a/shenxianhe/v1/account.proto b/src/account/v1/account.proto similarity index 95% rename from shenxianhe/v1/account.proto rename to src/account/v1/account.proto index 2841b49..c9e9d1e 100644 --- a/shenxianhe/v1/account.proto +++ b/src/account/v1/account.proto @@ -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 { diff --git a/shenxianhe/v1/notification.proto b/src/notification/v1/notification.proto similarity index 91% rename from shenxianhe/v1/notification.proto rename to src/notification/v1/notification.proto index 0f5129e..f37c20b 100644 --- a/shenxianhe/v1/notification.proto +++ b/src/notification/v1/notification.proto @@ -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; diff --git a/templates/go-sdk-readme.md b/templates/go-sdk-readme.md new file mode 100644 index 0000000..381decc --- /dev/null +++ b/templates/go-sdk-readme.md @@ -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. diff --git a/version.txt b/version.txt new file mode 100644 index 0000000..26aaba0 --- /dev/null +++ b/version.txt @@ -0,0 +1 @@ +1.2.0