Основной файл Oasis или Opam для простого проекта OCaml

Я новый пользователь OCaml. Я задал вопрос, чтобы узнать, как настроить базовый проект OCaml, но у меня все еще есть проблемы. Перейти к концу для TL;DR

Например, я пытаюсь выучить ирмин. На главной странице Irmin я вижу, что я должен сделать

opam install irmin git cohttp

В результате я получаю версию 0.8.3 Irmin. К сожалению, я не могу последовать их примеру, потому что, по-видимому, 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

а затем я скопировал пример с домашней страницы 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, будучи уверенным, что он является автономным (он не будет полагаться на предустановленные библиотеки, отличные от установленных в процессе сборки)?

1 ответ

Решение

Итак, во-первых, у вас нет активных целей в вашем _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

В результате я получаю версию 0.8.3 Irmin. К сожалению, я не могу последовать их примеру, потому что, по-видимому, Irmin имеет версию 0.9.4, и похоже, что API изменился. Итак, я хотел бы начать чистый проект с зависимостью только Irmin 0.9.4

Если вы получили версию, которая не является самой новой, то вы можете попытаться убедить решатель ограничений opam, что вам действительно нужна эта конкретная версия, например:

 opam install irmin.0.9.4 git cohttp

Кроме того, решение внутренних ограничений opam не очень сложное, поэтому убедитесь, что в вашей системе установлен aspcud. Следующее установит последнюю версию opam с aspcud в новой установке Ubuntu:

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"], но насколько хорошо он будет масштабироваться...

Другие вопросы по тегам