You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
135 lines
3.6 KiB
135 lines
3.6 KiB
#!/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
|
|
|