Skip to content

Пакетный менеджер OPAM

OCaml Package Manager (или просто OPAM) — пакетный менеджер для OCaml, управляющий пакетами в их исходном виде (в виде исходников), является частью OCaml Platform, как и Dune.

Через него можно поставить компилятор и всё остальное.

Опыт использования OPAM

Документация

Обновление пакетов

sh
$ opam update
$ opam upgrade

Могут возникать ошибки, из-за конфликта версий, но тут остается страдать.

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

Если проект имеет OPAM-манифест, то вы можете установить зависимости прописанные в нём, используя следующую команду:

sh
$ opam install . --deps-only

Окружения (они же switches)

OPAM хранит компилятор и пакеты в окружениях, называемые switch. При стандартной установки у вас должно появиться глобальное default окружение.

Работа с окружениями

Для работы с окружениями используйте команды из подгруппы opam switch.

Локального окружения для проекта

Распространенная задача, если у нас некий проект и мы хотим иметь специфичный набор пакетов, определённый компилятор и т.д. В случае если у нас есть OPAM-манифест, мы можем создать локальное окружение следующей командой:

sh
$ opam switch create . --deps-only

Публикация пакета

Центральный репозиторий пакетов для OCaml называется opam-repository и является GitHub-репозиторием, содержащий файлы манифестов.

Чтобы опубликовать ваш проект в opam-репозитории и сделать его общедоступным вам потребуется:

  1. Во-первых манифест проекта, файл <название-проекта>.opam. Самый простой и современный способ его получить — использовать Dune;
  2. Во-вторых GitHub-аккаунт для работы с репозиторием и настроенные SSH-ключи
    1. sh
      $ ssh-keygen -t ed25519 -C "your_email@example.com"
      $ eval "$(ssh-agent -s)"
      $ ssh-add ~/.ssh/id_ed25519
    2. Добавьте содержимое ~/.ssh/id_ed25519.pub в настройки пользователя
  3. Ну и Git само собой...

Рекомендации и возможные ошибки

Чётко указывайте версии зависимостей, в том числе для пакетов-компаньонов вашего проекта. Отнеситесь к этому достаточно дотошно, иначе потратите много времени.

Принцип

Если кратко, то внесение проекта в opam-репозиторий происходит посредством добавления файла манифеста в дерево репозитория. Например, манифест проекта с название xyz и версией 1.2.3 будет располагаться по пути packages/xyz/xyz.1.2.3/opam.

У такого манифеста должно быть указано поле url с информацией откуда достать исходный код проекта:

opam
url {
  src: "https://address/of/project.1.0.tar.gz"
  checksum: "md5=3ffed1987a040024076c08f4a7af9b21"
}

opam-publish

К счастью, для автоматизации процесса публикации существует специальная утилита opam-publish, которая является плагином к opam.

Установка

Рекомендуется установить утилиту в отдельный switch, так как она требовательна к версиям зависимостей и может сделать downgrade многих установленных пакетов.

sh
$ opam switch create publish 5.2.0
$ opam install opam-publish

Для публикации пакета с помощью утилиты необходимо создать тег и сделать его доступным из Интернета. Пример из документации:

sh
$ git tag -a 0.1
$ git push origin 0.1

$ opam publish

После чего утилита попросит ввести GitHub-токен, она сделает форк opam-репозитория и создаст pull-request (PR), где начнется автоматизированное тестирования на сборку платформой ocaml-ci.

Исправление ошибок

sh
$ git tag -f tag
$ git push -f origin tag

Принятие

После того как вы исправите все свои косяки, ваш PR сольют с репозиторием и вы сможете установить пакет обычным opam install.

Зависимости

pin-depends

Если вы хотите запинить зависимость в вашем пакете, то вы должно прописать поле pin-depends в ваш .opam манифест (для Dune смотрите .opam.template).

Пример добавления библиотеки vkashka с Git репозитория:

opam
pin-depends: [
  [ "vkashka.dev" "git+https://github.com/dx3mod/vkashka.git" ]
]

Оф. документация: https://opam.ocaml.org/doc/Manual.html#opamfield-pin-depends.