我正在使用Dune构建 OCaml 项目,并且我想构建一个独立的库以在其他项目中重用它。
库的根文件夹是,并且库是用(after )mylib
初始化的。dune init lib mylib src
cd mylib
mylib
项目的根目录树如下:
mylib
+---dune-project
│
+---src
dune
priv.ml
mymodule.ml
mymodule.mli
以下是文件的内容。
mylib/沙丘项目:
(lang dune 2.7)
mylib/src/dune:
(library
(name mylib))
mylib/src/priv.ml:
let rec loop a accu i =
let n = Array.length a in
if i = n then
accu
else
loop a (accu + Array.unsafe_get a i) (succ i)
mylib/src/mymodule.mli:
val sum : int array -> int
mylib/src/mymodule.ml:
let sum a =
Priv.loop a 0 0
在给出上下文并显示这个玩具示例的每个文件的内容之后,问题如下:
- 如何构建库
mylib
并在另一个单独的项目中使用它?
(例如,在另一个项目中,我会使用以下库:
Open Mylib
let () =
print_int (Mymodule.sum [1;2;3])
或者
let () =
print_int (Mylib.Mymodule.sum [1;2;3])
)
使用 Dune,给定可执行文件,如果它发布在Opammain
上,您将编写以下dune
文件以使用库。mylib
沙丘:
(executable
(name main)
(libraries mylib))
- 成功构建库并将其链接到另一个项目后,如何隐藏或不公开某些模块?例如,给定之前的玩具库
mylib
,我不想公开和使模块无法访问Priv
(这样Priv
只能在模块内部使用mylib
- 就像 Java/C# 中的受保护/内部类)。
</p>
我尝试在Real World OCaml、Cornell CS3110 教科书、Dune 文档、OCaml Learn上进行搜索,但除非深度嵌套,否则我一无所获。
非常感谢您的帮助,如果我没有清楚地解释某些事情,请询问,我会尽力解释得更好。