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