gRPC如何节省您的开发时间( 三 )


 
看一下下面的generate命令(我们将删除 , 生成并将代码移动到适当的文件夹中)
# content of: Makefileinit:git config core.hooksPath .githooksgenerate:# remove previously generated coderm -rf gogrpcspec/*# generate go codedocker run --rm -v ${CURDIR}:${CURDIR} -w ${CURDIR}znly/protoc--go_out=plugins=grpc:.${CURDIR}/proto/*.proto--proto_path=${CURDIR}# move generated code into gogrpcspec foldermv proto/*.go gogrpcspec 
生成代码后 , 希望将代码用于服务器或客户端的存根以调用服务的用户(开发人员)可以使用go get命令下载

go get -u github.com/redcranetech/grpcspec-example
 
然后用
import pb "github.com/redcranetech/grpcspec-example/gogrpcspec"
 
生成python代码
我们可以使用protoc将.proto文件编译成python代码 。
protoc --plugin=protoc-gen-grpc=/usr/bin/grpc_python_plugin
--python_out=./pygrpcspec
--grpc_out=./pygrpcspec
${pwd}/proto/*.proto
--proto_path=${pwd}
 
我们将改为通过docker使用protoc(为了便于开发人员使用)
docker run --rm -v ${CURDIR}:${CURDIR} -w ${CURDIR}
znly/protoc--plugin=protoc-gen-grpc=/usr/bin/grpc_python_plugin
--python_out=./pygrpcspec
--grpc_out=./pygrpcspec
${CURDIR}/proto/*.proto
--proto_path=${CURDIR}
 
为了使生成的代码进入python包以通过pip安装 , 我们需要执行额外的步骤:
· 创建setup.py
· 修改生成的代码(生成的代码使用文件夹名称导入 , 但我们将其更改为相对名称)
· 文件夹需要包含" init.py" , 以暴露生成的代码
使用以下模板创建setup.py文件:
# content of: setup.pyfrom setuptools import setup, find_packageswith open('README.md') as readme_file:README = readme_file.read()with open('HISTORY.md') as history_file:HISTORY = history_file.read()setup_args = dict(name='pygrpcspec',version='0.0.1',description='grpc spec',long_description_content_type="text/markdown",long_description=README + 'nn' + HISTORY,license='MIT',packages=['pygrpcspec','pygrpcspec.proto'],author='Napon Mekavuthikul',author_email='napon@redcranetech.com',keywords=['grpc'],url='https://github.com/redcranetech/grpcspec-example',download_url='')install_requires = ['grpcio>=1.21.0','grpcio-tools>=1.21.0','protobuf>=3.8.0']if __name__ == '__main__':setup(**setup_args, install_requires=install_requires) 
产生__init__.py
pygrpcspec文件夹的__init__.py必须是
# content of: pygrpspec/__init__.pyfrom . import proto__all__ = [ 'proto']并且pygrpcspec / proto文件夹的__init__.py必须是
# content of: pygrpspec/proto/__init__.pyfrom . import todo_pb2from . import todo_pb2_grpc__all__ = ['todo_pb2','todo_pb2_grpc',] 
为了使开发人员能够添加更多.proto文件并自动生成__init__.py , 一个简单的shell脚本可以解决此问题
# content of: genpyinit.shcat <<EOF >pygrpcspec/__init__.pyfrom . import proto__all__ = [ 'proto']EOFpyfiles=($(ls pygrpcspec/proto | sed -e 's/..*$//'| grep -v __init__))rm -f pygrpcspec/proto/__init__.pyfor i in "${pyfiles[@]}"do echo "from . import $i" >> pygrpcspec/proto/__init__.pydoneecho "__all__ = [" >> pygrpcspec/proto/__init__.pyfor i in "${pyfiles[@]}"do echo "'$i'," >> pygrpcspec/proto/__init__.pydoneecho "]" >> pygrpcspec/proto/__init__.py 
修改生成的代码
(如果您不太熟悉python模块 , 则可以跳过此阅读)
我们希望将每个"从原始导入"更改为"从" 。进口" 。这背后的原因是因为我们将数据类型 , 服务存根都放在同一目录中 , 并且为了在模块外部调用模块 , 每个内部引用都应该是相对的 。
sed -i -E 's/^from proto import/from . import/g' *.py此时 , 您的Makefile应该如下所示:
# content of: Makefileinit:git config core.hooksPath .githooksgenerate:# remove previously generated coderm -rf gogrpcspec/*# generate go codedocker run --rm -v ${CURDIR}:${CURDIR} -w ${CURDIR}znly/protoc--go_out=plugins=grpc:.${CURDIR}/proto/*.proto--proto_path=${CURDIR}# move generated code into gogrpcspec foldermv proto/*.go gogrpcspec# remove previously generated coderm -rf pygrpcspec/*# generate python codedocker run --rm -v ${CURDIR}:${CURDIR} -w ${CURDIR}znly/protoc--plugin=protoc-gen-grpc=/usr/bin/grpc_python_plugin--python_out=./pygrpcspec--grpc_out=./pygrpcspec${CURDIR}/proto/*.proto--proto_path=${CURDIR}# generate __init__.pysh genpyinit.sh# modify import using seddocker run --rm -v ${CURDIR}:${CURDIR} -w${CURDIR}/pygrpcspec/protofrolvlad/alpine-bashbash -c "sed -i -E 's/^from proto import/from . import/g' *.py"


推荐阅读