Где разместить общий служебный модуль в OCaml?

У меня есть файл Tools.ml который содержит некоторые общие служебные функции, которые я пишу сам. Под .../Code/ У меня есть несколько папок, каждая из которых содержит проект. Мой вопрос, где я должен разместить это Tools.ml такой что все папки и файлы под .../Code/ может поделиться этим модулем Open Tools,

Надеюсь, мой вопрос ясен... У кого-нибудь есть хорошее решение?

Edit1: После ответа @gasche я написал tools.ml следующее:

module Tools =
  struct
    let a_function = ...
    ...
  end

Затем я скомпилировал и сделал ocamlfind install tools META tools.cmo tools.cmx tools.ml как предложено, который выглядит хорошо. Тогда я написал test.ml следующее:

open Tools

let f = Tools.a_function

Затем я скомпилировал это с ocamlc test.ml -o testтогда я получил ошибку:

File "test.ml", line 1, characters 0-1:
Error: Error while linking test.cmo:
Reference to undefined global `Tools'

Кто-нибудь может сказать мне, что случилось?

1 ответ

Решение

Вы можете упаковать ее как независимую библиотеку, установить ее с другими библиотеками OCaml и получить к ней доступ из своего проекта как к библиотеке.

Очень простой способ сделать это - написать файл META для ocamlfind, Создайте каталог там, где вам удобно держать вас в "личной библиотеке" проекта. Предположим, у вас есть tools.ml а также tools.mli, и ваш код зависит от некоторого пакета findlib (например, unix а также bigarray). Вы МЕТА выглядели бы так:

name="tools"
description="personal collection of utilities"
version="0.1"
requires="unix,bigarray"
archive(byte)="tools.cmo"
archive(native)="tools.cmx"

После того, как вы написали этот файл META, легко спросить ocamlfind "установить" библиотеку (и удалить ее, если хотите) и использовать ее в других своих проектах. Чтобы установить, синтаксис ocamlfind install <name> <meta-file> <file1> <file2> ... где <file1>, <file2>.. файл, который вы хотите видеть включенным в каталог установки. Вы должны по крайней мере иметь tools.cmitools.cmo (а также tools.o а также tools.cmx для нативной компиляции), но это хорошая практика tools.mli например (и, если вы хотите предоставить код, tools.ml).

ocamlfind install tools META tools.cmi tools.cmo tools.o tools.cmx tools.mli

(Конечно tools.cmo и т.д. должны существовать, то есть вы должны install после того, как вы скомпилировали свой пакет. Если вы использовали ocamlbuildони могут быть в _build подкаталог, так ocamlfind install ... _build/tools.cmo ....)

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

ocamlfind ocamlc -package tools ....

или через средства, предоставленные ocamlbuild например, добавив package(tools) на ваши теги.

Чтобы переустановить библиотеку, если вы внесли в нее изменения и хотите, чтобы она была доступна из ваших проектов

ocamlfind remove tools
ocamlfind install tools META ...

Вы также можете справиться со всем этим через oasis, который является слоем поверх ocamlfind/ocamlbuild для автоматизации этого процесса. Я не достаточно знаком с oasis чтобы привести такие примеры в голову, но это должно быть одинаково просто для такого ограниченного случая (библиотека из одного файла) и лучше масштабироваться, если позже вы захотите расширить свою библиотеку (например, она также может обрабатывать создание документации, предварительная компиляция конфигурации...).

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