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