136 lines
3.6 KiB
Bash
136 lines
3.6 KiB
Bash
#!/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
|