简单的OCaml项目的基本Oasis或Opam文件

And*_*rea 6 ocaml ocamlbuild opam oasis

我是一名新的OCaml用户.我已经问了一个问题,以了解如何设置一个基本的OCaml项目,但我仍然有问题.跳到最后为TL; DR

例如,我正在努力学习Irmin.在Irmin主页上,我看到我必须这样做

opam install irmin git cohttp
Run Code Online (Sandbox Code Playgroud)

这样做,我最终得到了Irmin版本0.8.3.不幸的是,我不能按照他们的例子,因为显然Irmin的版本是0.9.4,看起来API已经改变了.所以,我想开始一个只有Irmin 0.9.4依赖的干净项目

首先,我已经设置了一个opam开关

 opam switch install playground -A 4.02.1
Run Code Online (Sandbox Code Playgroud)

一定要在干净的石板上工作.然后,我创建了一个_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
Run Code Online (Sandbox Code Playgroud)

然后我复制了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
Run Code Online (Sandbox Code Playgroud)

如果我这样做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
Run Code Online (Sandbox Code Playgroud)

所以简而言之,我的问题是:

设置依赖于Irmin 0.9.4的干净项目的最简单方法是什么,确保它是自包含的(它不依赖于预构建的库而不是构建过程安装的库)?

ivg*_*ivg 4

因此,首先您的文件中没有任何活动目标_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
Run Code Online (Sandbox Code Playgroud)

这样做,我最终得到了 Irmin 版本 0.8.3。不幸的是,我无法遵循他们的示例,因为显然 Irmin 的版本是 0.9.4,而且 API 看起来已经改变了。所以,我想启动一个干净的项目,仅依赖 Irmin 0.9.4

如果您获得的版本不是最新的,那么您可以尝试说服 opam 约束求解器,您确实需要该特定版本,例如:

 opam install irmin.0.9.4 git cohttp
Run Code Online (Sandbox Code Playgroud)

另外,opam 内部约束求解器不是很复杂,因此请确保您的系统上安装了 aspcud。以下命令将在全新的 ubuntu 安装上使用 aspcud 安装最新的 opam:

sudo add-apt-repository --yes ppa:avsm/ppa
sudo apt-get update
sudo apt-get --yes install opam
Run Code Online (Sandbox Code Playgroud)

设置依赖于 Irmin 0.9.4 的干净项目的最简单方法是什么,确保它是独立的(除了构建过程安装的库之外,它不会依赖于预安装的库)?

嗯,简单是个人意见的问题。例如,您可以在没有任何绿洲的情况下执行相同的操作,只需使用opam文件,您将build字段设置为["ocamlbuild"; "-use-ocamlfind"; "-pkgs irmin.unix,lwt.unix"; "example.native"],但它的扩展效果如何......