Несвязанный модуль в сборке OCaml / dune
Я впервые попробовал OCaml и попытался собрать пару файлов вместе.
Когда я бегу:
dune build bin/main.exe
Я получаю:
ocamlc bin/.main.eobjs/main.{cmi,cmo,cmt} (exit 2)
(cd _build/default && /usr/bin/ocamlc.opt -w @a-4-29-40-41-42-44-45-48-58-59-60-40 -strict-sequence -strict-formats -short-paths -keep-locs -g -bin-annot -I bin/.main.eobjs -I lib/.lib.objs -no-alias-deps -opaque -o bin/.main.eobjs/main.cmo -c -impl bin/main.ml)
File "bin/main.ml", line 10, characters 17-25:
Error: Unbound module Rule
Вот мой файл bin/main.ml:
open Lib
let () =
let result = Math.add 2 3 in
print_endline (string_of_int result);
let result = Math.sub 3 1 in
print_endline (string_of_int result);
let result = Zoom.barf 3 1 in
print_endline (string_of_int result);
let result = Rule.add 3 1 in
print_endline (string_of_int result);
в lib/inner/rule.ml, содержит:
let add x y = x + y
let sub x y = x - y
так что я думаю, что мне нужно как-то импортировать файл rule.ml в bin/main.ml
файл?
1 ответ
В настоящее время в Dune по умолчанию модули в разных каталогах не видны друг другу. Это контролируется (include_subdirs no)
раздел ( https://dune.readthedocs.io/en/latest/dune-files.html). С этой настройкой, чтобы ваши модули были видны друг другу, вам нужно поставить dune
файл с правильным содержимым в каждом подкаталоге. Если вы посмотрите, как это делает сам проект Dune ( https://github.com/ocaml/dune), ваша структура каталогов будет выглядеть так:
myproj/
bin/
dune
main.ml
lib/
dune
inner/
dune
rule.ml
Различные dune
файлы должны содержать правильные (library ...)
( https://dune.readthedocs.io/en/latest/dune-files.html) или (executable ...)
( https://dune.readthedocs.io/en/latest/dune-files.html) строфы, по мере необходимости.
Редактировать: после выполнения вышеизложенного, вам также необходимо обратиться к Rule
модуль по его полному "пути", т.е. Lib.Inner.Rule
,