我是OCaml的新用户。我已要求a question学习如何设置基本的OCaml项目,但仍然存在问题。跳转到TL; DR的结尾

例如,我正在尝试学习Irmin。在home page of Irmin上,我必须做

opam install irmin git cohttp

这样做,最终得到的是Irmin版本0.8.3。不幸的是,我无法遵循他们的示例,因为显然Irmin的版本为0.9.4,并且API似乎已更改。因此,我想开始一个仅依赖于Irmin 0.9.4的干净项目

首先,我用
 opam switch install playground -A 4.02.1

确保工作在干净的状态。然后,我创建了一个基本的_oasis文件,如下所示
OASISFormat: 0.4
Name:        Playground
Version:     0.1.0
Synopsis:    OCaml playground
Authors:     Andrea Ferretti
License:     Apache-2.0
BuildTools: ocamlbuild

BuildDepends:
  irmin,
  irmin.unix,
  lwt,
  lwt.unix

然后,我从Irmin主页上的example.ml复制了该示例。
open Lwt
open Irmin_unix
let store = Irmin.basic (module Irmin_git.FS) (module Irmin.Contents.String)
let config = Irmin_git.config ~root:"/tmp/irmin/test" ~bare:true ()
let prog =
  Irmin.create store config task >>= fun t ->
  Irmin.update (t "Updating foo/bar")  ["foo"; "bar"] "hi!" >>= fun () ->
  Irmin.read_exn (t "Reading foo/bar") ["foo"; "bar"] >>= fun x ->
  Printf.printf "Read: %s\n%!" x;
  return_unit
let () = Lwt_main.run prog

如果我先做oasis setup,然后再做ocamlbuild example.ml,我会收到一堆错误
W: Cannot get variable ext_obj
W: Cannot get variable ext_lib
W: Cannot get variable ext_dll
W: Cannot get variable ocamlfind

简而言之,我的问题是:

最佳答案

因此,首先,您的_oasis文件中没有任何事件目标。我的意思是,OASIS与构建可执行文件和库有关。您也没有描述。这意味着,您的BuildDepends没有任何作用,因为它仅对LibraryExecutable条目有意义。因此,第一近似为:

OASISFormat: 0.4
Name:        Playground
Version:     0.1.0
Synopsis:    OCaml playground
Authors:     Andrea Ferretti
License:     Apache-2.0
BuildTools:   ocamlbuild
BuildDepends: irmin.unix, lwt.unix

Executable "example"
  Path: .
  MainIs: example.ml
  CompiledObject: best



如果获得的不是最新版本,则可以尝试说服opam约束求解器,您确实需要该特定版本,例如:
 opam install irmin.0.9.4 git cohttp

另外,opam内部约束求解器不是很完善,因此请确保在系统上安装了aspcud。以下将在全新的ubuntu安装中使用aspcud安装最新的opam:
sudo add-apt-repository --yes ppa:avsm/ppa
sudo apt-get update
sudo apt-get --yes install opam



好吧,简单性是个人观点的问题。例如,只需使用opam文件,就可以在没有任何绿洲的情况下进行相同的操作,在该文件中,您将build字段设置为["ocamlbuild"; "-use-ocamlfind"; "-pkgs irmin.unix,lwt.unix"; "example.native"],但是伸缩性如何……

10-06 14:47