несвязанный модуль в сборке 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?


person Alexander Mills    schedule 06.01.2019    source источник


Ответы (1)


В Dune в настоящее время по умолчанию модули в разных каталогах не видны друг другу. Это контролируется строфой (include_subdirs no) (https://dune.readthedocs.io/en/latest/dune-files.html#include-subdirs). С этой настройкой, чтобы ваши модули были видны друг другу, вам нужно поместить 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#library) или (executable ...) (https://dune.readthedocs.io/en/latest/dune-files.html#executable) при необходимости.

Изменить: после выполнения вышеуказанного вам также необходимо обратиться к модулю Rule по его полному «пути», то есть Lib.Inner.Rule.

person Yawar    schedule 06.01.2019
comment
так что я бы назвал open Lib.Inner.Rule в bin / main.ml правильно? - person Alexander Mills; 06.01.2019
comment
@AlexanderMills обычно рекомендуется избегать opening модулей и вместо этого ссылаться на них по имени. Если имя длинное, рекомендуется использовать псевдоним более короткого имени в как можно меньшей области, например let () = let module Rule = Lib.Inner.Rule in ... - person Yawar; 06.01.2019
comment
спасибо, у меня проблемы с bin/dune файлом .. У меня есть этот (executable (name main) (libraries lib)), но я считаю, что мне тоже нужно сослаться на inner библиотеку - person Alexander Mills; 06.01.2019
comment
хорошо, он работает с (executable (name main) (libraries lib inner)) спасибо - person Alexander Mills; 06.01.2019