Как создать код эликсира, используя файлы protobuf? - PullRequest
1 голос
/ 28 марта 2020

Я нашел много библиотек для определения сообщений protobuf и все, но я не смог найти способ генерировать код эликсира, используя файлы .proto, такие как компилятор elixir для буферов протокола. Что сообщество использует для этого?

1 Ответ

2 голосов
/ 31 марта 2020

У меня есть решение, но я не знаю, что вы хотите с сгенерированным кодом эликсира (вы можете разобрать из макрофилированных файлов луча). Я думаю, что сгенерированного макроса достаточно для 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

...