protoc-gen-lua 여러 proto 내장 실현

2785 단어 lua
우선 우리 에 게 필요 한 protobuf lua 내 보 내기 도구https://github.com/sean-lin/protoc-gen-lua,구체 적 으로 사용,자신의 proto 파일 을 작성,protoc--lua 사용out=./ foo.proto lua 파일 을 내 보 내 면 됩 니 다.lua 파일 을 내 보 내 는 주요 구현 은 plugin 에서 protoc-gen-lua 파일 입 니 다.이 도 구 는 proto 의 내장 을 지원 하지 않 습 니 다.예 를 들 어 두 개의 proto 파일 이 있 습 니 다.
basic.proto 에서 메시지 바 꾸 기:
message Item{
     required int32 id = 1;
     ...
}

또 다른 proto 는 basic.proto 의 Item 이라는 message 를 인용 합 니 다.예 를 들 어 userproc.proto
message Sell{
      optional int32 t = 1;
      repeated Item items = 2;
      ...
} 

인용 을 추가 하지 않 으 면 상기 proto 가 잘못 보고 할 수 있 습 니 다.정상 적 인 상황 에서 package 를 도입 해 야 합 니 다.basic.proto 와 userproc.proto 는 다음 과 같이 수정 합 니 다.
#basic.lua
package protobuf_basic_export

.....

4.567913.이렇게 내 보 내 면 잘못 보고 하지 않 고 protobuf 의 쓰기 요구 에 부합 합 니 다.
그러나 protoc-gen-lua 에서 내 보 낸 lua 파일 에 문제 가 있 습 니 다.실행 한 결과 userproc_pb_lua 오류 보고:BAISCPB_ITEM 에서 찾 을 수 없습니다.이것 은 도구 가 만 든 필드 입 니 다.이 type 이 현재 proto 아래 에 없 을 때 생 성 됩 니 다.합 성 된 필드 입 니 다.lua 가 실행 하면 이 필드 를 찾 을 수 없습니다.우리 가 수정 하고 자 하 는 곳 도 다음 과 같이 바 꿔 야 합 니 다.
USER_PROC_ITEM_FIELD.message_type = BASIC_PB.ITEM
BASICPB 내 보 낼 basicpb.lua 파일 이 므 로 내 보 낸 python 파일 을 수정 하여 우리 의 요 구 를 실현 합 니 다.
1:합병 제거
#user_proc.proto
import "basic.proto";

message Sell{
     optional int32 t = 1;
     repeated protobuf_basic_export.Item items = 2;
     ...
}

:2:message descriptor 를 전역 으로 설정 합 니 다.
    if field_desc.HasField('type_name'):
        type_name = env.get_ref_name(field_desc.type_name).upper()

3:pb 대문자 인용,유형 일치 즉 local BASICPB = require("basic_pb")
def code_gen_message(message_descriptor, env, containing_type = None):
    env.enter(message_descriptor.name)
    full_name = env.get_local_name()
    obj_name = full_name.upper().replace('.', '_')
    env.descriptor.append(
        "%s = protobuf.Descriptor();
"% obj_name ):

내 보 내기 후 파일 변환:
    if is_gen:
        lua = Writer()
        write_header(lua)
        lua('local protobuf = require "protobuf"
') for i in includes: lua('local %s_PB = require("%s_pb")
' % (i.upper(), i)) lua("module('%s_pb')
" % env.filename)
-- Generated By protoc-gen-lua Do not Edit

local protobuf = require "protobuf"
module('basic_pb')


ITEM= protobuf.Descriptor();
local ITEM_ID_FIELD = protobuf.FieldDescriptor();

이렇게 베 이 직PB.ITEM 은 찾 을 수 있 습 니 다.바로 basicpb.lua 리
git https://github.com/AdamWu/protoc-gen-lua
ps:구름 바람 pb 를 사용 할 수 있 습 니 다.proto 관 계 를 지원 합 니 다.

좋은 웹페이지 즐겨찾기