#!/bin/bash set -e SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" &>/dev/null && pwd) RPC_ROOT="${SCRIPT_DIR}/.." THIRD_PARTY="${RPC_ROOT}/../pkg/third_party" LOG_FILE="${SCRIPT_DIR}/gen-rpc.log" exec > >(tee "${LOG_FILE}") 2>&1 function gen_one() { local svc="$1" echo "===== Processing ${svc} =====" PROTO="${RPC_ROOT}/${svc}/${svc}.proto" # pb输出目录,rpc目录下 RPC_SVC_DIR="${RPC_ROOT}/${svc}" PB_OUT="${RPC_SVC_DIR}/pb" # zrpc直接输出到services/${svc} ZRPC_OUT="${RPC_ROOT}/../services/${svc}" mkdir -p "${PB_OUT}" mkdir -p "${ZRPC_OUT}/internal/server" # 关键:只删除server.go,logic、dao、etc全部保留不动 rm -f "${ZRPC_OUT}/internal/server/${svc}server.go" goctl rpc protoc "${PROTO}" \ --proto_path="${THIRD_PARTY}" \ --proto_path="${RPC_ROOT}" \ --module=lone-services \ --go_out="${PB_OUT}" \ --go-grpc_out="${PB_OUT}" \ --go_opt=M"${svc}/${svc}.proto"="./" \ --go-grpc_opt=M"${svc}/${svc}.proto"="./" \ --zrpc_out="${ZRPC_OUT}" \ --style=goZero # rm -rf "${PB_OUT}/lone-services" # 清理rpc目录中goctl意外生成的垃圾(etc/internal/server/client等),只保留proto/pb # rm -rf "${RPC_SVC_DIR:?}/etc" # rm -rf "${RPC_SVC_DIR:?}/internal" # rm -rf "${RPC_SVC_DIR:?}/server" # rm -rf "${RPC_SVC_DIR:?}/${svc}Client" # rm -f "${RPC_SVC_DIR:?}/${svc}.go" protoc "${PROTO}" \ -I"${THIRD_PARTY}" \ -I"${RPC_ROOT}" \ --include_imports \ --descriptor_set_out="${RPC_SVC_DIR}/${svc}.pb" echo "===== Completed ${svc} =====" echo } function scan_all_services() { local services=() for dir in "${RPC_ROOT}"/*/; do svc=$(basename "${dir%/}") proto_file="${RPC_ROOT}/${svc}/${svc}.proto" if [[ -f "${proto_file}" ]]; then services+=("${svc}") fi done echo "${services[@]}" } ALL_SERVICES=($(scan_all_services)) if [ $# -ge 1 ]; then for svc in "$@"; do proto_file="${RPC_ROOT}/${svc}/${svc}.proto" if [[ ! -f "${proto_file}" ]]; then echo "[ERROR] rpc service [${svc}] not found, missing proto file" exit 1 fi gen_one "${svc}" done else for svc in "${ALL_SERVICES[@]}"; do gen_one "${svc}" done echo "All rpc code & apisix descriptor generated finished" if [ -t 0 ]; then read -r -p "Press Enter to exit..." fi fi