2013-05-28 11 views
7

Ich versuche, dieses Stück Code zu machen:Ocamlbuild und Pakete mittels OPAM installiert

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 

Wenn jedoch i

laufen
Ocamlbuild file.native 

ich ungebunden Modulfehler bekommen.

Diese Module wurden über OPAM installiert und wenn ich

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

laufen Wie erhalte ich Ocamlbuild diese beiden Pakete zu finden?

Ich habe

versucht
Ocamlbuild -pkgs cohttp,lwt file.native 

und es hat nicht funktioniert. Es sagte etwas über eine möglicherweise inkorect Erweiterung. Ich denke nicht, dass das das Problem ist.

Wenn jemand mir den richtigen Code geben kann, würde dies sehr geschätzt werden. Vielen Dank!

+0

Ich hatte ein Problem in der Vergangenheit, wo ich ocamlbuild an zwei verschiedenen Orten installiert hatte, also diese zwei Installationen prüften verschiedene Verzeichnisse beim Suchen nach Bibliotheken. Sie könnten versuchen: "/home/chris/.opam/bin/ocamlbuild -use-ocamlfind -pkgs cohttp.lwt file.native" (korrigieren Sie den Pfad, wenn es nicht ganz richtig ist), um sicherzustellen, dass Sie nicht das gleiche Verhalten sehen . –

Antwort

7

Cohttp wurde aktualisiert, so habe ich den Code korrigiert, um die neueste Version zu verwenden:

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 

Sie können mit bauen

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

Ein paar Kommentare:

1) Sie sollten das -use-ocamlfind mit ocamlbuild verwenden, um opam (oder andere installierte ocaml libs)

zu verwenden

2) Um cohttp mit lwt zu verwenden, sollten Sie das cohttp.lwt Paket verwenden. Das Hinzufügen von lwt ist ebenfalls nicht unbedingt notwendig.

+0

das hat nicht funktioniert. Ich habe einen Fehler erhalten, der besagt, dass Ocaflind das Paket cohttp.lwt nicht finden konnte, auch wenn ich das Flag "-use-ocamlfind" in meiner ursprünglichen Anweisung verwende, funktionierte dies auch nicht. Ich habe Ihren Code jedoch in meine Datei eingefügt. –

+0

sollte 'ocatflind Abfrage cohttp.Geben Sie einen Pfad zurück, sonst haben Sie Cohttp nicht korrekt installiert. – rgrinberg

+0

Ocamlfind Abfrage cohttp.lwt sagt das Paket ist nicht installiert. Ich habe mein Cohttp-Paket deinstalliert, es dann mit opam neu installiert und erhalte immer noch den gleichen Fehler. Ist das möglicherweise ein OPAM-Problem? –

1

Ich habe dieses Problem gelöst, indem ich die Version von ocaml-findlib, die ich über den Paketmanager meiner Distribution installiert hatte, deinstalliert habe. Aus irgendeinem Grund versuchte ocamlbuild es anstelle der Version opam zu verwenden, obwohl letztere zuerst auf meiner $PATH ist.

Die Version von ocamlfind, die über den Paketmanager meiner Distribution installiert wurde, konnte die lokalen Pakete, die ich über opam installiert hatte, nicht finden.

Nach http://brion.inria.fr/gallium/index.php/Using_ocamlfind_with_ocamlbuild hat ocamlbuild Unterstützung enthalten für ocamlfind über die -use-ocamlfind Flagge seit 3.12, so sollten Sie mit dieser Hinsicht gut sein. Sie können über ocamlbuild --help | grep ocamlfind überprüfen. Wenn Ihre Version dies unterstützt, dann sollten Sie in der Lage sein, Ihr Paket als @rgrinberg beschrieben zu erstellen.

+0

Ich habe das gleiche Problem, außer ohne Root-Zugriff kann ich Distro 'ocamlfind' nicht entfernen. Ich frage mich, ob ich es irgendwie "beschatten" könnte. –

Verwandte Themen