如何在ocaml文件中的项目根目录之外打开定义的模块?

时间:2018-10-04 20:48:24

标签: ocaml oasis

我没有ocaml的经验,这里的情况是我正在编写ocaml代码,我尝试访问其他.ml文件中定义的类型,这些文件位于我的项目根目录之外。 我试图设置_oasis,但是当我指定 library 字段时, Path 值无效,因为我尝试使用“ ../../ dir” 。 有谁知道我如何实现这个目标?我不想将它们复制到我的项目根目录中,因为在浏览这些教程时,还没有找到解决方案,谢谢!

1 个答案:

答案 0 :(得分:1)

oasis的想法是在项目的根目录中有一个_oasis文件,该文件定义了整个项目。因此,所有路径都相对于根文件夹(包含_oasis的根文件夹)指定

在您的情况下,项目结构可能如下所示:

my_project/
|
+- _oasis
+-lib/
| |
| +- types/
|    |
|    +- common.ml
+-src/
  |
  +- app/
     |
     +- app_main.ml

与之对应的_oasis文件为:

OASISFormat: 0.4
Name:        myproject
Version:     0.1
Synopsis:    captures the world
Authors:     robots
Maintainers: humans
License:     MIT
Copyrights:  (C) Acme corp
Plugins:     META (0.4)
BuildTools: ocamlbuild


Library "common_types"
  Path: lib/types
  FindlibName: acme-common-types
  Modules: Common

Executable "control-people"
  Path: src/app
  MainIs: app_main.ml
  Install: true
  BuildDepends: common_types

最后,由于merlin实际上是一种工具,因此您还可以考虑通过将.merlin文件添加到项目的根文件夹中来教他您的项目结构,该文件具有以下内容:

 B _build/
 B _build/lib/types
 B _build/src/app
 S lib/types
 S src/app

如果有任何外部依赖项,则可以使用.merlin,例如PKG <findlib-name-of-the-dep>将它们添加到PKG core_kernel。而且,当然,您应该使用BuildDepends子句,例如BuildDepends: core_kernel,将外部依赖项添加到_oasis文件中的库和应用程序中。