我是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 开关
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
然后我从 example.ml
年的 Irmin 主页复制了示例.
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: %sn%!" 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 的干净项目的最简单方法是什么,确保它是自包含的(它不会依赖于构建过程安装的库以外的预安装库)?
因此,首先,您的_oasis
文件中没有任何活动目标。我的意思是,OASIS是关于构建可执行和库的。你也没有描述。这意味着,您的BuildDepends
没有任何影响,因为它只对Library
和Executable
条目有意义。因此,第一个近似值如下:
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 安装上安装带有 aspcud 的最新 opam:
sudo add-apt-repository --yes ppa:avsm/ppa
sudo apt-get update
sudo apt-get --yes install opam
设置依赖于 Irmin 0.9.4 的干净项目的最简单方法是什么,确保它是自包含的(它不会依赖于 预安装的库,而不是由内部版本安装的库 过程)?
好吧,简单是个人意见的问题。例如,您可以在没有任何绿洲的情况下执行相同的操作,只需使用opam
文件即可设置build
字段,只是为了["ocamlbuild"; "-use-ocamlfind"; "-pkgs irmin.unix,lwt.unix"; "example.native"]
,但它的扩展程度如何......