MirageOS - пример HTTP-выборки

Я пытаюсь немного изменить пример http-fetch MirageOS (https://github.com/mirage/mirage-skeleton), который можно найти внутри mirage-skeleton, но у меня возникли проблемы с пониманием того, почему я не могу переместить часть функций, выполняемых в файле config.ml, в мой файл unikernel.ml. Исходный файл config.ml следует (я скопирую только интересную часть):

[...]
let client =
      foreign "Unikernel.Client" @@ console @-> resolver @-> conduit @-> job

let () =
  add_to_ocamlfind_libraries ["mirage-http"];
  add_to_opam_packages ["mirage-http"];
  let sv4 = stack default_console in
  let res_dns = resolver_dns sv4 in
  let conduit = conduit_direct sv4 in
  let job =  [ client $ default_console $ res_dns $ conduit ] in
  register "http-fetch" job

Я пытаюсь переместить эти две строки:

  let res_dns = resolver_dns sv4 in
  let conduit = conduit_direct sv4 in

в мой метод запуска unikernel.ml. В основном я хочу передать своему модулю только стек и позволить ему создать преобразователь DNS и канал. Моя стартовая функция выглядит следующим образом:

  let start c s =
    C.log_s c (sprintf "Resolving in 1s using DNS server %s" ns) >>= fun () ->
    OS.Time.sleep 1.0 >>= fun () ->
    let res_dns = resolver_dns s in
        let conduit = conduit_direct s in 
            http_fetch c res_dns conduit >>= fun (data) ->
            Lwt.return(dump_to_db data);

Прямо сейчас я получаю эту ошибку при отправке параметров http_fetch:

Error: This expression has type Mirage.resolver Mirage.impl
       but an expression was expected of type Resolver_lwt.t

Я задаю здесь в основном концептуальный вопрос, потому что я явно чего-то упускаю. Я не эксперт в OCaml / MirageOS, но это противоречивое поведение несоответствия типов трудно понять, учитывая, что я просто вызываю одну и ту же функцию из другого файла.


person Vittorio Cozzolino    schedule 17.02.2016    source источник
comment
config.ml и unikernel.ml компилируются совершенно по-разному (и даже не в одном месте). Почему вы хотите скопировать какой-то код с одного на другой?   -  person Drup    schedule 17.02.2016
comment
Я в основном экспериментировал. Моя настоящая проблема в том, что я испытываю эту проблему в списках .xenproject.org / archives / html / mirageos-devel / 2015-06 /, и я пытаюсь следовать совету создания резолвера и канала непосредственно внутри unikernel.   -  person Vittorio Cozzolino    schedule 17.02.2016


Ответы (1)


config.ml используется для создания main.ml. Вы можете скопировать оттуда сгенерированный код, если хотите.

person Thomas Leonard    schedule 17.02.2016
comment
Спасибо, что указали мне правильное направление. Посмотрев на код внутри main.ml, мне удалось переместить экземпляр преобразователя и канала в unikernel.ml. К сожалению, это не устранило проблему DHCP (Routing.No_route_to_destination_address), о которой я упоминал в своем комментарии выше :(. - person Vittorio Cozzolino; 17.02.2016