使用 Oasis 构建 OCaml 项目时未定义的模块

Undefined module when using Oasis to build an OCaml project

又是我..我正在做一个 OCaml 项目,我想用 Oasis 来构建整个代码库。这是我的代码库的组织方式。

src/
    core/
      init.ml
      type.ml
      utils.ml
    plugin/
      main.ml

我首先仅使用以下 _oasis 文件构建库:

Library "engine"                                                       
Path: src/core                                                         
Modules:                                                               
  Init,                                                                
  Type,                                                                
  Utils                                                            
BuildDepends:   deriving, deriving.syntax, core, batteries             
XMETADescription: core engine

而且效果很好。没有错误,我可以在_build/src/core文件夹中找到一个库engine.a

但是,当我尝试通过以下方式将库包含在 main.ml 中时:

Module T = Engine.Type
...

并使用以下 _oasis 文件进行编译:

Library "engine"                                                       
Path: src/core                                                         
Modules:                                                               
  Init,                                                                
  Type,                                                                
  Utils                                                            
BuildDepends:   deriving, deriving.syntax, core, batteries             
XMETADescription: core engine


Executable "main"                                                      
  Path:           src/plugin                                         
  MainIs:         main.ml                                              
  CompiledObject: best                                                   
  Install:        false                                                  
  BuildDepends:   core, batteries, engine

我收到一个错误:

Unbound module Engine

我是不是做错了什么?谁能给我一些帮助?谢谢!

您的 _oasis 模块定义了一个名为 engine 的库,但它没有定义 Engine 模块。因此,您的 InitTypeUtils 模块已公开,应该可以直接访问而无需任何前缀。

如果您想将这些模块打包到父模块中,您可以:

  • 手动将每个模块打包成一个大engine.ml文件
  • _oasis 文件的 Library 部分中使用 Pack: true,这会将包含的模块打包到名为 Engine
  • 的模块中
  • 使用模块别名(参见the OCaml manual for more information