123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 |
- #!/bin/bash
- DEFAULT_PROTOC_GEN="gogofast"
- DEFAULT_PROTOC="protoc"
- GO_COMMON_DIR_NAME="go-common"
- USR_INCLUDE_DIR="/usr/local/include"
- function _install_protoc() {
- osname=$(uname -s)
- echo "install protoc ..."
- case $osname in
- "Darwin" )
- brew install protobuf
- ;;
- *)
- echo "unknown operating system, need install protobuf manual see: https://developers.google.com/protocol-buffers"
- exit 1
- ;;
- esac
- }
- function _install_protoc_gen() {
- local protoc_gen=$1
- case $protoc_gen in
- "gofast" )
- echo "install gofast from github.com/gogo/protobuf/protoc-gen-gofast"
- go get github.com/gogo/protobuf/protoc-gen-gofast
- ;;
- "gogofast" )
- echo "install gogofast from github.com/gogo/protobuf/protoc-gen-gogofast"
- go get github.com/gogo/protobuf/protoc-gen-gogofast
- ;;
- "gogo" )
- echo "install gogo from github.com/gogo/protobuf/protoc-gen-gogo"
- go get github.com/gogo/protobuf/protoc-gen-gogo
- ;;
- "go" )
- echo "install protoc-gen-go from github.com/golang/protobuf"
- go get github.com/golang/protobuf/{proto,protoc-gen-go}
- ;;
- *)
- echo "can't install protoc-gen-${protoc_gen} automatic !"
- exit 1;
- ;;
- esac
- }
- function _find_go_common_dir() {
- local go_common_dir_name=$1
- local current_dir=$(pwd)
- while [[ "$(basename $current_dir)" != "$go_common_dir_name" ]]; do
- current_dir=$(dirname $current_dir)
- if [[ "$current_dir" == "/" || "$current_dir" == "." || -z "$current_dir" ]]; then
- return 1
- fi
- done
- echo $current_dir
- }
- function _fix_pb_file() {
- local target_dir=$1
- echo "fix pb file"
- local pb_files=$(find $target_dir -name "*.pb.go" -type f)
- local pkg_name_esc=$(echo "$target_dir" | sed 's_/_\\/_g')
- for file in $pb_files; do
- echo "fix pb file $file"
- if [[ $(uname -s) == 'Darwin' ]]; then
- sed -i "" -e "s/^import \(.*\) \"app\/\(.*\)\"/import \1 \"go-common\/app\/\2\"/g" $file
- else
- sed -i"" -E "s/^import\s*(.*)\s*\"app\/(.*)\"/import\1\"go-common\/app\/\2\"/g" $file
- fi
- done
- }
- function _esc_string() {
- echo $(echo "$1" | sed 's_/_\\/_g')
- }
- function _run_protoc() {
- local proto_dir=$1
- local proto_files=$(find $proto_dir -maxdepth 1 -name "*.proto")
- if [[ -z $proto_files ]]; then
- return
- fi
- local protoc_cmd="$PROTOC -I$PROTO_PATH --${PROTOC_GEN}_out=plugins=grpc:. ${proto_files}"
- echo $protoc_cmd
- $protoc_cmd
- }
- if [[ -z $PROTOC ]]; then
- PROTOC=${DEFAULT_PROTOC}
- which $PROTOC
- if [[ "$?" -ne "0" ]]; then
- _install_protoc
- fi
- fi
- if [[ -z $PROTOC_GEN ]]; then
- PROTOC_GEN=${DEFAULT_PROTOC_GEN}
- which protoc-gen-$PROTOC_GEN
- if [[ "$?" -ne "0" ]]; then
- _install_protoc_gen $PROTOC_GEN
- fi
- fi
- GO_COMMON_DIR=$(_find_go_common_dir $GO_COMMON_DIR_NAME)
- if [[ "$?" != "0" ]]; then
- echo "can't find go-common directoy"
- exit 1
- fi
- if [[ -z $PROTO_PATH ]]; then
- PROTO_PATH=$GO_COMMON_DIR:$GO_COMMON_DIR/vendor:$USR_INCLUDE_DIR
- else
- PROTO_PATH=$PROTO_PATH:$GO_COMMON_DIR:$GO_COMMON_DIR/vendor:$USR_INCLUDE_DIR
- fi
- if [[ ! -z $1 ]]; then
- cd $1
- fi
- TARGET_DIR=$(pwd)
- GO_COMMON_DIR_ESC=$(_esc_string "$GO_COMMON_DIR/")
- TARGET_DIR=${TARGET_DIR//$GO_COMMON_DIR_ESC/}
- # switch to go_common
- cd $GO_COMMON_DIR
- DIRS=$(find $TARGET_DIR -type d)
- for dir in $DIRS; do
- echo "run protoc in $dir"
- _run_protoc $dir
- done
- _fix_pb_file $TARGET_DIR
|