Ocamlbuild и пакеты, установленные через Opam

Я пытаюсь сделать этот кусок кода:

open Lwt;;
open Cohttp;;
(* a simple function to access the content of the response *)
let content = function
  | Some (_, body) -> Cohttp_lwt_unix.Body.string_of_body body


(* launch both requests in parallel *)
let t = Lwt_list.map_p Cohttp_lwt_unix.Client.get
  (List.map Uri.of_string
     [ "http://example.org/";
       "http://example2.org/" ])

(* maps the result through the content function *)
let t2 = t >>= Lwt_list.map_p content

(* launch the event loop *)
let v = Lwt_main.run t2

однако, когда я запускаю

Ocamlbuild file.native

Я получаю несвязанные ошибки модуля.

эти модули были установлены через opam и когда я запускаю

ocamlfind query lwt 
/home/chris/.opam/system/lib/lwt
ocamlfind query cohttp
/home/chris/.opam/system/lib/cohttp

как получить Ocamlbuild, чтобы найти эти два пакета?

Я пробовал

Ocamlbuild -pkgs cohttp,lwt file.native 

и это не сработало. Там говорилось что-то о возможном неправильном расширении. Не думаю, что в этом проблема. хотя.

если кто-нибудь может дать мне правильный код для этого будет принята с благодарностью. Спасибо!

2 ответов


Cohttp был обновлен, поэтому я исправил ваш код, чтобы использовать последнюю версию:

open Lwt;;
open Cohttp;;
(* a simple function to access the content of the response *)
let content = function
| Some (_, body) -> Cohttp_lwt_body.string_of_body body
| None -> assert false


(* launch both requests in parallel *)
let t = Lwt_list.map_p Cohttp_lwt_unix.Client.get
(List.map Uri.of_string
    [ "http://google.com";
    "http://yahoo.com" ])

(* maps the result through the content function *)
let t2 = t >>= Lwt_list.map_p content

(* launch the event loop *)
let v = Lwt_main.run t2

вы можете построить с

ocamlbuild -use-ocamlfind -pkgs cohttp.lwt file.native

пара комментариев:

1) Вы должны использовать -use-ocamlfind С ocamlbuild использовать opam (или любые другие установленные библиотеки ocaml)

2) для использования cohttp с lwt вы должны использовать cohttp.lwt пакета. Добавление lwt также не является строго необходимым.


я решил эту проблему, удалив версию ocaml-findlib, которую я установил через Диспетчер пакетов моего дистрибутива. По какой причине ocamlbuild пытался использовать его вместо версии, представленной opam, несмотря на то, что последний был первым на моем $PATH.

версия ocamlfind, который был установлен через Диспетчер пакетов моего дистрибутива, не смог найти локальные пакеты, которые я установил через opam.

по данным http://brion.inria.fr/gallium/index.php/Using_ocamlfind_with_ocamlbuild, ocamlbuild включил поддержку ocamlfind через -use-ocamlfind флаг с 3.12 поэтому вы должны быть хорошо с этим. Вы можете проверить через ocamlbuild --help | grep ocamlfind. Если ваша версия поддерживает его, вы сможете создать свой пакет, как описано в @rgrinberg.