一个简单的OCaml项目所需的基本 Oasis 或 Opam 文件

6
我是一名新的OCaml用户。 我已经提出了一个问题,以了解如何设置基本的OCaml项目,但我仍然有问题。 跳到结尾查看TL;DR。
例如,我正在尝试学习Irmin。 在Irmin的主页上,我看到我必须执行以下操作。
opam install irmin git cohttp

这样做,我最终得到了Irmin 0.8.3版本。不幸的是,我无法按照他们的例子操作,因为似乎Irmin已经更新到了0.9.4版本,并且API已经发生了变化。因此,我想开始一个全新的项目,只依赖于Irmin 0.9.4。

首先,我已经设置了一个opam switch环境:

 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

简而言之,我的问题是:

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


Irmin在官方存储库中被标注为0.9.3。这是你问题中的一个打字错误还是你很长时间没有进行opam update - PatJ
1
他可能也有一些依赖关系迫使他降级。虽然,在安装了相当数量的软件包后,我没有遇到任何问题。 - nlucaroni
当你没有aspcud时,这是一个常见的问题。很多时候它会降级所有东西。 - ivg
1个回答

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

这样做,我最终得到了Irmin 0.8.3版本。不幸的是,我无法按照他们的示例进行操作,因为似乎Irmin已经更新到了0.9.4版本,并且API也发生了变化。因此,我想开始一个新的项目,只依赖于Irmin 0.9.4版本。
如果你使用的是旧版本,你可以尝试说服opam约束求解器,让它相信你确实需要那个特定版本,例如:
 opam install irmin.0.9.4 git cohttp

此外,opam内部的约束求解器不是非常复杂,因此请确保您的系统已安装了aspcud。以下内容将在全新的Ubuntu安装上安装最新版本的opam和aspcud:

sudo add-apt-repository --yes ppa:avsm/ppa
sudo apt-get update
sudo apt-get --yes install opam

什么是建立在Irmin 0.9.4上的干净项目的最简单方法,确保它是自包含的(除了通过构建过程安装的库之外,它将不依赖于预安装的库)?
好吧,简洁性是一个人主观看法。例如,您可以完全不使用oasis来完成相同的工作,只需使用opam文件,在其中设置您的build字段,仅为["ocamlbuild"; "-use-ocamlfind"; "-pkgs irmin.unix,lwt.unix"; "example.native"],但它的可扩展性如何...

谢谢,你非常有帮助! - Andrea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接