Где разместить общий служебный модуль в 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.cmi
tools.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
чтобы привести такие примеры в голову, но это должно быть одинаково просто для такого ограниченного случая (библиотека из одного файла) и лучше масштабироваться, если позже вы захотите расширить свою библиотеку (например, она также может обрабатывать создание документации, предварительная компиляция конфигурации...).