在pycharm中使用protobuf

廉价感情. 提交于 2020-01-24 23:31:41

主要目标

  1. 记录在pycharm中使用protobuf的过程
  2. 将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")

劳动成果:
在这里插入图片描述
只要思想不滑坡,办法总比困难多。 不就几十行代码的事情嘛,溜了溜了。。。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!