沙丘:构建库并在另一个项目中访问它,隐藏或制作不可访问的私有或实现模块

Dune: build library and access it in another project and hide or make inaccessible private or implementation modules

我正在使用 Dune 构建 OCaml 项目,我想构建一个独立的库以便在其他项目中重用它。

库的根文件夹是 mylib,库是用 dune init lib mylib src 初始化的(在 cd mylib 之后)。

项目根目录 mylib 的目录树如下:

mylib
+---dune-project
│
+---src
        dune
        priv.ml
        mymodule.ml
        mymodule.mli

文件内容如下。

mylib/dune-project:

(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

给出上下文并显示这个玩具示例的每个文件的内容后,问题如下:

  1. 如何构建库 mylib 并在另一个单独的项目中使用它?

(例如,在另一个项目中,我将使用以下内容使用库:

Open Mylib
let () =
  print_int (Mymodule.sum [1;2;3])

let () =
  print_int (Mylib.Mymodule.sum [1;2;3])

)

使用 Dune,给定可执行文件 main,您将编写以下 dune 文件以使用库 mylib,如果它发布在 Opam.

沙丘:

(executable
 (name main)
 (libraries mylib))
  1. 成功构建库并链接到另一个项目后,如何隐藏或不暴露某些模块?例如,给定之前的玩具库 mylib,我不想公开模块 Priv 并使其不可访问(这样 Priv 只能在 [=19 的模块内部使用=] - 就像 protected/internal class 中的 Java/C#).

我尝试在 Real World OCaml, Cornell CS3110 textbook, Dune documentation, OCaml Learn 上搜索,但除非嵌套很深,否则我一无所获。

非常感谢您的帮助,如果我没有解释清楚,请提问,我会尽力解释得更好。

  1. 在根目录下,这些应该是一个名为mylib.opam的文件,其内容类似于this one。然后,(public_name mylib) s 表达式应该添加到 mylib/src/dune 中的 library。最后,确保位于项目的根目录中,库应使用 dune build 构建并使用 opam install ..
    安装 要在另一个项目中实际使用该库,即使在不同的 dune 工作区中,只需将 (libraries mylib) 添加到将使用该库的项目的 dune 文件中。
  2. (private_modules priv) s 表达式应添加到 mylib/src/dune 中的 library。然后,需要使用以下内容创建 mylib.mlmodule Mymodule = Mymodule:这将确保只有 Mymodule 会暴露在包 Mylib.