通过Opam安装Ocamlbuild和Packages

时间:2013-05-28 02:38:14

标签: ocaml 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 个答案:

答案 0 :(得分:7)

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-ocamlfindocamlbuild来使用opam(或任何其他已安装的ocaml库)

2)要使用cowt与lwt,你应该使用cohttp.lwt包。同样添加lwt并非绝对必要。

答案 1 :(得分:1)

我通过卸载我通过我的发行版软件包管理器安装的ocaml-findlib版本解决了这个问题。由于某些原因,ocamlbuild尝试使用它而不是opam提供的版本,尽管后者是$PATH的第一个。

通过我的发行版软件包管理器安装的ocamlfind版本找不到我通过opam安装的本地软件包。

根据http://brion.inria.fr/gallium/index.php/Using_ocamlfind_with_ocamlbuildocamlbuild自3.12以来已通过ocamlfind标志包含对-use-ocamlfind的支持,因此您应该善于这方面。您可以通过ocamlbuild --help | grep ocamlfind查看。如果你的版本支持它,那么你应该能够像@rgrinberg所描述的那样构建你的包。