У меня есть решение, но я не знаю, что вы хотите с сгенерированным кодом эликсира (вы можете разобрать из макрофилированных файлов луча). Я думаю, что сгенерированного макроса достаточно для protobuf
общения, и вам не нужен сгенерированный код эликсира. Кстати, вы можете использовать сгенерированные beam
файлы вручную (еще одно уродливое решение)
Мое уродливое решение
Добавить exprotobuf в качестве зависимости для вашего проекта:
defp deps do
[{:exprotobuf, "~> 1.2"}]
end
Тогда запустите mix deps.get
для извлечения.
Добавьте exprotobuf в список приложений:
def application do
[applications: [:exprotobuf]]
end
Вам нужен файл протора, например 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 Messages do
use Protobuf, from: Path.expand("msg.proto", __DIR__)
end
И затем
iex -S mix
В консоли 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
Я не рекомендую Использование этого решения. Это просто для удовольствия.
Используйте exprotobuf или protobuf , они создадут макрос из ваших proto
файлов для лучшей производительности. Существуют некоторые ограничения.
ОБНОВЛЕНИЕ: я не пробовал, но readme.md
содержит раздел «Генерация кода эликсира» в пакете protobuf .
ОБНОВЛЕНИЕ2: Я успешно проверил это. Я скомпилировал некоторые .proto
файлы на основе раздела «Сгенерировать код эликсира» в protobuf