如何使用protobuf文件生成elixir代码?

如何使用protobuf文件生成elixir代码?,elixir,protocol-buffers,Elixir,Protocol Buffers,我找到了很多用于定义protobuf消息的库,但我找不到一种方法来使用.proto文件生成elixir代码,比如协议缓冲区的elixir编译器。社区对此使用了什么?我有一个解决方案,但我不知道您希望如何使用生成的elixir代码(您可以从宏编译的beam文件中反汇编)。我认为生成的宏足以进行protobuf通信,您不需要任何生成的elixir代码。顺便说一句,您可以手动使用生成的beam文件(另一个丑陋的解决方案) 我丑陋的解决方案 将exprotobuf作为依赖项添加到项目中: defp de

我找到了很多用于定义protobuf消息的库,但我找不到一种方法来使用
.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
文件,您可以使用它生成文件。免责声明:我维护此库。