Где разместить общий служебный модуль в OCaml? - PullRequest
12 голосов
/ 29 декабря 2011

У меня есть файл 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 Ответ

13 голосов
/ 29 декабря 2011

Вы можете упаковать ее как независимую библиотеку, установить ее с другими библиотеками 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.cmotools.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 напрямую, если это то, что вы уже делаете для компиляции своих программ

ocamlfind ocamlc -package tools ....

или, например, с помощью ocamlbuild, добавив package(tools) к вашим тегам.

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

ocamlfind remove tools
ocamlfind install tools META ...

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

...