Использование Opam для управления зависимостями проекта

Я полный новичок в OCaml. Другие языки, которые я использовал (например, Scala, Clojure, Javascript в Node.js), имеют менеджеров пакетов, которые позволяют запускать проект как чистый сланец, который имеет объявленный набор зависимостей известных версий.

Я пытаюсь сделать что-то подобное с Opam. В идеале, я хотел бы иметь файл, в котором перечислены зависимости (и, возможно, версия OCaml), чтобы коллаборатор мог запустить проект с помощью

git clone myproject
<magic opam command>
ocamlbuild

и иметь рабочую версию, не установив ничего глобально.

Я понимаю, что правильным способом сделать это будет использование Opam switch, но я не уверен, что делать на практике. Кажется, что коммутаторы привязаны к версии компилятора, а не к одному проекту (хотя существуют псевдонимы), а также я не мог найти, существует ли какой-то файл конфигурации проекта Opam.

Вкратце: скажем, хочется начать новый проект в зависимости от Core и Yojson (для примера). Какими будут шаги для создания чистой воспроизводимой сборки? Здесь чистый означает, что он не будет мешать существующим установленным библиотекам, а воспроизводимый означает, что он будет работать на чистой машине с недавно клонированным проектом.

Ответы

Ответ 1

Это не может быть действительно чистым в отношении системных библиотек. В противном случае вам нужно запустить свою собственную виртуальную машину или другой контейнер. Но в отношении среды OCaml вы можете достичь своей цели с помощью файла opam в корне вашего проекта. После того, как вы описали все свои зависимости (в том числе и системные), вы можете pin ваш проект, и это установит все ваши зависимости, скомпилирует ваш проект и разворачивает его в стек opam. Итак, рабочий процесс следующий:

 $ # install opam 1.2
 $ # install aspcud (optionally, but highly recommended)
 $ opam switch install fresh -A 4.02.1
 $ opam pin add proj /path/to/proj -n
 $ opam depext --install proj
 # optional part:
 $ edit proj/src/main.ml # do the development
 $ opam upgrade proj

Теперь пройдите через этот рабочий процесс поэтапно.

Установить компилятор

 $ opam switch install fresh -A 4.02.1 

Эта команда создает новую установку компилятора. Здесь fresh не имеет особого значения, это просто произвольное имя для установки. Обычно я использую команду date +"%y%m%d" вместо fresh, которая создает имя, состоящее из текущего года, месяца и дня.

Вызов проекта

$ opam pin add proj /path/to/proj -n

Эта команда представит ваш проект в систему OPAM. Это похоже на создание собственного небольшого репозитория пакетов, содержащего только один пакет, proj. Название proj - это, конечно, просто название вашего проекта, что бы это ни было. pin использует opam файл, который описывает ваш проект в системе OPAM, вы можете создать его вручную с помощью инструкций. Или вы можете позволить команде pin создать ее для вас. Это поможет вам осторожно пройти процесс, задав несколько вопросов. Вы можете узнать больше о закреплении в этом сообщении в блоге.

Установка пакета и зависимостей

В предыдущей команде мы добавляем флаг -n, который остановит команду pin от установки вашего пакета сразу после пиннинга, потому что мы хотим двигаться небольшими шагами.

$ opam depext --install proj

Эта команда будет вычислять транзитивное закрытие зависимостей вашего пакета и устанавливать их, включая ваши системные зависимости (если вы находитесь на ubuntu или fedora, и если вы указали свои зависимости в файле opam на предыдущем шаге),

Работа над проектом

Предположим, вы хотите разработать код. Существует удобный рабочий процесс OPAM:

 $ edit proj/src/main.ml # do the development
 $ opam upgrade proj

Это переустановит ваши пакеты (и переустановит всех иждивенцев вашего пакета, если они существуют).

Этот рабочий процесс, с другой стороны, имеет серьезный недостаток, если ваш проект не крошечный, поскольку он скопирует все источники и скомпилирует их с нуля. Но если у вас есть набор зависимых пакетов, на которых вы работаете параллельно, то это способ сделать это.

Компиляция и другие материалы

Но это касается только управления пакетами и межпакетов. OPAM абсолютно не зависит от конкретной системы сборки и не дает никакой пользы никому из них (но для некоторых из них по-прежнему есть инструментальная поддержка). Таким образом, вы можете написать Makefile самостоятельно или создать собственный набор сценариев оболочки, вызывающих ocamlbuild, это абсолютно зависит от вас. Но если бы я был в вас, я буду использовать OASIS для управления процессом строительства. OASIS сама по себе не является системой сборки, ее цель - управлять системами сборки кросс-платформенным способом. Но по умолчанию он использует ocamlbuild и интегрируется с ним плавно. Кроме того, он имеет интеграцию с OPAM (фактически это OPAM, у которого есть интеграция с OASIS). Существует пакет oasis2opam, который создаст файл opam из файла _oasis. Что касается создания файла _oasis, описывающего процесс построения вашего проекта, то вы можете создать его вручную с помощью своего любимого текстового emacs, или вы можете позволить OASIS создать его для вас с помощью oasis quickstart.

В качестве заключительного замечания я бы предложил вам просмотреть существующие проекты и использовать их в качестве источника вдохновения. Вы можете начать с проекта BAP, который я поддерживаю, но он имеет довольно сложную конфигурацию. Таким образом, могут быть более простые примеры.