#!/bin/bash # Proto 文件编译脚本 # 用途:编译所有 proto 文件为 Go 代码 set -e # 进入项目根目录 SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR/.." # 添加 GOPATH/bin 到 PATH export PATH="$PATH:$(go env GOPATH)/bin" echo "======================================" echo "开始编译 Proto 文件" echo "======================================" # 检查 protoc 是否已安装 if ! command -v protoc &> /dev/null; then echo "❌ protoc 未安装!" echo "请安装 protoc:" echo " macOS: brew install protobuf" echo " Ubuntu: apt-get install protobuf-compiler" exit 1 fi echo "✅ protoc 版本: $(protoc --version)" # 检查必要的 Go 插件 MISSING_PLUGINS=false if ! command -v protoc-gen-go &> /dev/null; then echo "❌ protoc-gen-go 未安装" MISSING_PLUGINS=true fi if ! command -v protoc-gen-go-triple &> /dev/null; then echo "❌ protoc-gen-go-triple 未安装" MISSING_PLUGINS=true fi if [ "$MISSING_PLUGINS" = true ]; then echo "" echo "请安装缺失的插件:" echo " go install google.golang.org/protobuf/cmd/protoc-gen-go@latest" echo " go install github.com/dubbogo/protoc-gen-go-triple/v3@latest" exit 1 fi echo "✅ 所有必需插件已安装" echo "" # 预先创建目标目录 echo "📁 创建目标目录..." for name in common user social asset gallery ranking activity task starbook; do mkdir -p "pkg/proto/$name" done echo "" # 编译 common.proto(仅生成 pb.go;common.proto 没有 service,生成 triple.go 会导致未使用 import 编译失败) echo "📦 编译 common.proto ..." protoc --proto_path=proto \ --go_out=pkg/proto/common \ --go_opt=paths=source_relative \ common.proto echo "✅ common.proto 编译完成" echo "" # 编译 user.proto echo "📦 编译 user.proto ..." protoc --proto_path=proto \ --proto_path=. \ --go_out=pkg/proto/user \ --go_opt=paths=source_relative \ --go-triple_out=pkg/proto/user \ --go-triple_opt=paths=source_relative \ user.proto echo "✅ user.proto 编译完成" echo "" # 编译 social.proto echo "📦 编译 social.proto ..." protoc --proto_path=proto \ --proto_path=. \ --go_out=pkg/proto/social \ --go_opt=paths=source_relative \ --go-triple_out=pkg/proto/social \ --go-triple_opt=paths=source_relative \ social.proto echo "✅ social.proto 编译完成" echo "" # 编译 asset.proto echo "📦 编译 asset.proto ..." protoc --proto_path=proto \ --proto_path=. \ --go_out=pkg/proto/asset \ --go_opt=paths=source_relative \ --go-triple_out=pkg/proto/asset \ --go-triple_opt=paths=source_relative \ asset.proto echo "✅ asset.proto 编译完成" echo "" # 编译 gallery.proto echo "📦 编译 gallery.proto ..." protoc --proto_path=proto \ --proto_path=. \ --go_out=pkg/proto/gallery \ --go_opt=paths=source_relative \ --go-triple_out=pkg/proto/gallery \ --go-triple_opt=paths=source_relative \ gallery.proto echo "✅ gallery.proto 编译完成" echo "" # 编译 ranking.proto echo "📦 编译 ranking.proto ..." protoc --proto_path=proto \ --proto_path=. \ --go_out=pkg/proto/ranking \ --go_opt=paths=source_relative \ --go-triple_out=pkg/proto/ranking \ --go-triple_opt=paths=source_relative \ ranking.proto echo "✅ ranking.proto 编译完成" echo "" # 编译 activity.proto echo "📦 编译 activity.proto ..." protoc --proto_path=proto \ --proto_path=. \ --go_out=pkg/proto/activity \ --go_opt=paths=source_relative \ --go-triple_out=pkg/proto/activity \ --go-triple_opt=paths=source_relative \ activity.proto echo "✅ activity.proto 编译完成" echo "" # 编译 task.proto echo "📦 编译 task.proto ..." protoc --proto_path=proto \ --proto_path=. \ --go_out=pkg/proto/task \ --go_opt=paths=source_relative \ --go-triple_out=pkg/proto/task \ --go-triple_opt=paths=source_relative \ task.proto echo "✅ task.proto 编译完成" echo "" # 编译 starbook.proto echo "📦 编译 starbook.proto ..." protoc --proto_path=proto \ --proto_path=. \ --go_out=pkg/proto/starbook \ --go_opt=paths=source_relative \ --go-triple_out=pkg/proto/starbook \ --go-triple_opt=paths=source_relative \ starbook.proto echo "✅ starbook.proto 编译完成" echo "" # 清理可能存在的冗余目录和文件 echo "🔄 清理冗余文件..." # 删除 github.com 目录(如果存在) if [ -d "github.com" ]; then rm -rf github.com echo " ✅ github.com 目录已清理" fi # 删除 proto 目录下的生成文件(如果存在) for name in common user social asset gallery ranking activity task starbook; do if [ -f "proto/$name.pb.go" ]; then rm "proto/$name.pb.go" echo " ✅ proto/$name.pb.go 已清理" fi if [ -f "proto/$name.triple.go" ]; then rm "proto/$name.triple.go" echo " ✅ proto/$name.triple.go 已清理" fi # 清理 pkg/proto/$name/proto/ 子目录(如果存在) if [ -d "pkg/proto/$name/proto" ]; then rm -rf "pkg/proto/$name/proto" echo " ✅ pkg/proto/$name/proto/ 子目录已清理" fi done echo " ✅ 所有文件已整理完成" echo "" echo "生成的文件结构:" echo " pkg/proto/" echo " ├── common/" echo " │ ├── common.pb.go" echo " │ └── (no triple.go)" echo " ├── user/" echo " │ ├── user.pb.go" echo " │ └── user.triple.go" echo " ├── social/" echo " │ ├── social.pb.go" echo " │ └── social.triple.go" echo " ├── asset/" echo " │ ├── asset.pb.go" echo " │ └── asset.triple.go" echo " ├── gallery/" echo " │ ├── gallery.pb.go" echo " │ └── gallery.triple.go" echo " ├── ranking/" echo " │ ├── ranking.pb.go" echo " │ └── ranking.triple.go" echo " └── activity/" echo " ├── activity.pb.go" echo " └── activity.triple.go" echo "" # 统计生成的文件 GENERATED_FILES=$(find pkg/proto -name "*.pb.go" -o -name "*.triple.go" 2>/dev/null | wc -l) echo "======================================" echo "✅ 所有 Proto 文件编译完成!" echo "======================================" echo "生成文件总数: $GENERATED_FILES" echo "" echo "下一步:" echo " 1. 实现 RankingService 接口" echo " 2. 创建 Provider 层" echo " 3. 注册 Dubbo 服务" echo ""