文章目录
主要目标
- 记录在pycharm中使用protobuf的过程
- 将protobuf中的枚举类型转换为JS对象
在pycharm中使用protobuf
1. 工具安装
1.1 下载protoc
- 下载适合自己系统版本的protoc点击链接
- 建议将protoc将入环境变量中,便于使用
1.2. pycharm中安装插件
在pycharm中可以编辑.proto文件,但是需要安装protobuf support插件
1.3 安装对应库
- python版本
pip install protobuf
2. 使用
2.1 编写proto文件
具体语法规范还是看教程吧,木有整理,直接贴代码。
message_proto.proto文件
syntax = "proto3";
// package top.huanmengmie; // 定义包名
enum ErrorCode{
Failed = 0;
Success = 1; // 请求成功
ParamInvalid = 10; // 参数不合法
UserExisted = 20; // 用户已存在
UserPassNotMatch = 21; // 密码错误
}
enum UserRole{
Customer = 0;
SuperAdmin = 1;
Admin = 2;
}
2.2 转化为指定语言的文件
protoc提供了将proto文件转化为符合python,Java, javascript等语言规范的工具。
语法规范 protoc [OPTION] PROTO_FILES
例如:转化为python文件 protoc --python_out=. message_proto.proto
, 其中=
号后面的第一个参数.
是文件保存地址(对应上面的OUT_DIR),第二个参数就是要操作的proto文件了。
将protobuf中的枚举类型转换为JS对象
当我在用protoc生成js文件时,碰到一个尴尬的问题。你给的我不想要,我要的你给不了!!!
1. 问题来了
首先,照惯例执行 protoc --js_out=. message_proto.proto
,发现生成了好多js文件
认真看了一波,卧槽,它自动将我的每一个枚举都生成了一个单独的JS文件,还把属性全部转化成了大写字母,这就有点难受了。太多了,享受不起啊。
然后,网上百度了一波,生成js文件又另外的带参数的命令protoc --js_out=import_style=commonjs,binary:. address.proto
,赶紧拿去尝试了一波。
emmmmmm,这样看起来果然就好多了,生成一个单独的文件,名字也是惯例**_pb.js
。
但是吧,我觉得这个东西,给我后端来用着并不方便啊。。。。。
2. proto文件转js脚本
搜了半天,没有找到一个好的解决办法。
我能怎么办,我也很绝望啊!!!
算了吧,自己动手,丰衣足食。
# -*- coding:utf-8 -*-
import re
def proto2js(file):
with open(file, "r", encoding="utf8") as f:
content = f.read()
# 将文件修改为js格式
content = content.replace("enum ", "let ")
content = content.replace("=", ":")
content = re.sub("(let.*?)({)", handle, content, re.S)
content = content.replace(";", ",")
content_list = content.splitlines()
# 保存js文件
file_name = file.rsplit(".", maxsplit=1)
js_file = "{}.js".format(file_name[0])
with open(js_file, "w", encoding="utf8") as f:
for item in content_list:
if not item or not item.strip():
continue
if re.match("^[syntax|package|import]", item.strip(), re.S):
continue
if item.strip() == "}":
f.writelines(item + ";\n\n")
else:
f.writelines(item + "\n")
def handle(matched):
return "{} = {}".format(matched.group(1), matched.group(2))
if __name__ == '__main__':
proto2js("message_proto.proto")
劳动成果:
只要思想不滑坡,办法总比困难多。 不就几十行代码的事情嘛,溜了溜了。。。
来源:CSDN
作者:MoHe_YiBei
链接:https://blog.csdn.net/qq_38370828/article/details/103746893