0

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

库的根文件夹是,并且库是用(after )mylib初始化的。dune init lib mylib srccd 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

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

  1. 如何构建库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))
  1. 成功构建库并将其链接到另一个项目后,如何隐藏或不公开某些模块?例如,给定之前的玩具库mylib,我不想公开和使模块无法访问Priv(这样Priv只能在模块内部使用mylib- 就像 Java/C# 中的受保护/内部类)。

​</p>

我尝试在Real World OCamlCornell CS3110 教科书Dune 文档OCaml Learn上进行搜索,但除非深度嵌套,否则我一无所获。

非常感谢您的帮助,如果我没有清楚地解释某些事情,请询问,我会尽力解释得更好。

4

1 回答 1

0
  1. 在根目录中,这些应该是一个名为的文件mylib.opam,其内容与类似。然后,(public_name mylib)应该将 s 表达式添加到librarymylib /src/dune中。最后,确保在项目的根目录中,该库应使用 构建dune build和安装opam install .
    为了在另一个项目中实际使用该库,即使在不同的沙丘工作区中,只需添加(libraries mylib)到将使用该库的项目的沙丘文件中即可。
  2. (private_modules priv)s 表达式应该添加到librarymylib /src/dune中。然后,mylib.ml需要创建以下内容:module Mymodule = Mymodule:这将确保只有Mymodule在包下才会暴露Mylib
于 2021-03-07T16:19:11.603 回答