使用 dune 编译时包含嵌套在子目录中的 mly 文件

Include mly files nested in subdirectories when compiling with dune

假设我有以下目录:

.
├── dune-project
├── myproj.opam
└── src
    ├── dune
    ├── module1.ml
    ├── parser1
    │   └── file1.ml
    └── parser2
        └── file2.ml

因为我希望所有内容都在同一个库中,所以我有以下内容:

src/dune:

(include_subdirs  unqualified)

(library
 (name myproj)
 (modules module1 file1 file2)
  )

而且编译得很好。

现在,我的 file1 和 file2 实际上是 mly 文件,所以我有这个:

.
├── dune-project
├── myproj.opam
└── src
    ├── dune
    ├── module1.ml
    ├── parser1
    │   └── parser1.mly
    └── parser2
        └── parser2.mly

如果我尝试编译(通过 dune 文件中的解析器 (1|2) 更改文件 (1|2)),我会遇到以下错误:

❯ dune build
File "src/dune", line 5, characters 26-33:
5 |  (modules module1 parser1 parser2 )
                              ^^^^^^^
Error: Module Parser2 doesn't exist.

我编辑我的沙丘文件:

(include_subdirs  unqualified)

(menhir
 (modules parser1 parser2)
)

(library
 (name myproj)
 (modules module1 parser1 parser2 )
  )

现在有两个错误:

❯ dune build
File "src/dune", line 3, characters 0-36:
3 | (menhir
4 |  (modules parser1 parser2)
5 | )
Error: No rule found for src/parser1.mly
File "src/dune", line 3, characters 0-36:
3 | (menhir
4 |  (modules parser1 parser2)
5 | )
Error: No rule found for src/parser2.mly

好的,然后我在 parser(1|2) 目录中添加两个沙丘文件:

(menhir
 (modules parser(1|2))
)

[编辑] 看起来我错过了什么,但这实际上工作得很好

现在我遇到了和以前一样的错误:

❯ dune build
File "src/dune", line 5, characters 26-33:
5 |  (modules module1 parser1 parser2 )
                              ^^^^^^^
Error: Module Parser2 doesn't exist.

我是不是漏掉了一些可以取悦沙丘的东西? (如果我有 .mll 文件,我也会遇到同样的问题)

竖石stanza doesn't work with subdirs。这是一个尚未修复的错误1。有几个解决方法,比如将沙丘文件添加到您拥有解析器的文件夹中(我自己没有检查)。但我建议将解析器拆分到单独的库中或将它们移动到 src 文件夹中。前者是首选,特别是从那时起你就不需要写 modules 节了。


1)截至 2022 年 1 月