Как использовать protobuf в ReasonML?

У меня есть набор типов protobuf, и я хочу сгенерировать код reasonML для сериализации. На данный момент я обнаружил, что ocaml-protoc не устанавливается в моей системе. Используя докер,

FROM ocaml/opam:alpine
RUN opam remote add dev git://github.com/mirage/mirage-dev
RUN opam depext -i mirage

RUN opam depext conf-m4.1
RUN yes | opam install ocaml-protoc

затем запустите команду:

docker run \
        --mount type=bind,source=$(PWD)/../src/proto,target=/home/opam/ocaml \
        --mount type=bind,source="$(PWD)"/../../proto,target=/home/opam/proto \
        -ti eb1b1ed36a35 \
        ocaml-protoc -ml_out=/home/opam/ocaml /home/opam/proto/chat.proto > /dev/null"

Мне удалось собрать набор файлов ml / mli. Однако эти файлы зависят от некоторых неустановленных библиотек, таких как Pbrt. Отрывок:

let rec decode_friend_event_etype d = 
  match Pbrt.Decoder.int_as_varint d with
  | 0 -> (Chat_types.Arrival:Chat_types.friend_event_etype)
  | 1 -> (Chat_types.Departure:Chat_types.friend_event_etype)
  | _ -> Pbrt.Decoder.malformed_variant "friend_event_etype"

--------------^

Есть ли чистый способ решить эту проблему без установки собственных библиотек? Все, что включено, должно быть предоставлено исходным кодом, чтобы bucklescript мог скомпилировать его в JS.

Решение, которое приходит на ум, если бы оно было доступно, заключалось бы в генерации общих зависимостей (таких как Pbrt) вместе с реализациями прототипов. Кто-нибудь нашел способ решить эту проблему?


person Keynan    schedule 01.04.2018    source источник


Ответы (1)


Есть среда выполнения Bucklescript и демонстрационный проект, показывающий, как его использовать.

Я сам этого не пробовал, но насколько я понимаю, вам нужно будет добавить среду выполнения protobuf bucklescript как обычную зависимость Bucklescript.

npm install bs-ocaml-protoc-json

добавьте его в bs-dependencies в bsconfig.json

{
  ...
  "bs-dependencies": [ "bs-ocaml-protoc-json"]
}

а затем сгенерируйте специфичный для Bucklescript код с ocaml-protoc, используя флаг -bs:

ocaml-protoc -bs -ml_out=/home/opam/ocaml /home/opam/proto/chat.proto

Теперь у вас должен быть сгенерированный исходный код в /home/opam/ocaml и, если у вас есть проект bucklescript, правильно настроенный с этим в качестве исходной папки, вы сможете скомпилировать его с bsb -make-world

person glennsl    schedule 01.04.2018
comment
Я использую bs-ocaml-protoc-json в промежуточном режиме, однако я прошу кодирование protobuf, а не создание кодировщиков json из файлов proto, которые, afaik, - это все, что предоставляет библиотека. - person Keynan; 03.04.2018
comment
Вы имеете в виду двоичную кодировку? Это совсем не ясно из вашего вопроса. Похоже, ocaml-protoc включает саму среду выполнения двоичного кодирования. Возможно, вы сможете извлечь и упаковать его для Bucklescript. Другой вариант - скомпилировать его с js_of_ocaml, который лучше взаимодействует с экосистемой opam, но потребует написания привязок Bucklescript для взаимодействия и может стать действительно раздутым. - person glennsl; 03.04.2018