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

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

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

git clone myproject
<magic opam command>
ocamlbuild

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

Я понимаю, что правильный способ сделать это - использовать коммутаторы Opam, но я не уверен, что делать на практике. Кажется, что переключатели связаны с версией компилятора, а не для каждого проекта (хотя есть псевдонимы), а также я не мог найти, существует ли своего рода файл конфигурации проекта 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). E сть oasis2opam пакет, который создаст opam файл из _oasis файл. Как насчет создания _oasis файл, который описывает процесс сборки вашего проекта, затем вы можете либо создать его вручную с вашими любимыми текстовыми Emacs, либо вы можете позволить OASIS создать его для вас с oasis quickstart,

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

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