如何使用protobuf文件生成elixir代码?
我找到了很多用于定义protobuf消息的库,但我找不到一种方法来使用如何使用protobuf文件生成elixir代码?,elixir,protocol-buffers,Elixir,Protocol Buffers,我找到了很多用于定义protobuf消息的库,但我找不到一种方法来使用.proto文件生成elixir代码,比如协议缓冲区的elixir编译器。社区对此使用了什么?我有一个解决方案,但我不知道您希望如何使用生成的elixir代码(您可以从宏编译的beam文件中反汇编)。我认为生成的宏足以进行protobuf通信,您不需要任何生成的elixir代码。顺便说一句,您可以手动使用生成的beam文件(另一个丑陋的解决方案) 我丑陋的解决方案 将exprotobuf作为依赖项添加到项目中: defp de
.proto
文件生成elixir代码,比如协议缓冲区的elixir编译器。社区对此使用了什么?我有一个解决方案,但我不知道您希望如何使用生成的elixir代码(您可以从宏编译的beam文件中反汇编)。我认为生成的宏足以进行protobuf
通信,您不需要任何生成的elixir代码。顺便说一句,您可以手动使用生成的beam
文件(另一个丑陋的解决方案)
我丑陋的解决方案
将exprotobuf作为依赖项添加到项目中:
defp deps do
[{:exprotobuf,“~>1.2”}]
结束
然后运行mix deps.get
进行提取
将exprotobuf添加到应用程序列表:
def应用程序
[应用:[:exprotobuf]]
结束
您需要一个包含以下内容的proto文件,例如msg.proto
:
message Msg {
message SubMsg {
required uint32 value = 1;
}
enum Version {
V1 = 1;
V2 = 2;
}
required Version version = 2;
optional SubMsg sub = 1;
}
创建一个长生不老药文件,例如:/lib/messages.ex
:
defmodule消息的作用
使用Protobuf,from:Path.expand(“msg.proto”,\uuuu DIR\uuuu)
结束
然后
iex-S混合
在iex控制台中
iex(1)> tic_tac_toe = ("your app name in mix.exs -> project -> app")
iex(2)> f = "./_build/#{Atom.to_string(Mix.env)}/lib/#{tic_tac_toe}/ebin/Elixir.Messages.Msg.beam"
"./_build/dev/lib/tic_tac_toe/ebin/Elixir.Messages.Msg.beam"
iex(3)> {:ok, beam} = File.read(f)
{:ok,
<<70, 79, 82, 49, 0, 0, 13, 132, 66, 69, 65, 77, 65, 116, 85, 56, 0, 0, 1, 144,
0, 0, 0, 37, 19, 69, 108, 105, 120, 105, 114, 46, 77, 101, 115, 115, 97, 103,
101, 115, 46, 77, 115, 103, 8, 95, 95, 105, ...>>}
iex(4)> IO.inspect :beam_disasm.file(beam), pretty: true
iex(1)>tic\u tac\u toe=(“mix.exs->project->app中的应用程序名”)
iex(2)>f=“../_build/#{Atom.to_string(Mix.env)}/lib/#{tic_tac_toe}/ebin/Elixir.Messages.Msg.beam”
“/_build/dev/lib/tic_tac_toe/ebin/Elixir.Messages.Msg.beam”
iex(3)>{:ok,beam}=File.read(f)
{好的,
}
iex(4)>IO.inspect:beam_disasm.file(beam),pretty:true
我不推荐使用这种解决方案。只是为了好玩
使用,否则他们将从您的proto
文件创建宏,以获得最佳性能。有一些限制
更新:
我没有尝试过,但包中的readme.md
包含一个“生成长生不老药代码”部分
更新2:
我已经成功地测试了它。我根据中的“生成长生不老药代码”部分编译了一些.proto
文件,您可以使用它生成文件。免责声明:我维护此库。