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

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

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

git clone myproject
<magic opam command>
ocamlbuild

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

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

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

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 

эта команда создает новую установку компилятора. Вот!--7--> не имеет особого значения, это просто произвольное имя для установки. Обычно я использую вместо fresh, что создает имя, состоящее из текущего года, месяца и дня.

закрепить проекта

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

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

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

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

$ opam depext --install proj

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

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

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

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

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

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

компиляция и другие вещи

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

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