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.