我期望
dune
在运行 dune build
时自动下载依赖项,但这并没有发生。
我尝试了多种变体,并且尝试使用 ocaml 版本 4.14 和 5.0,以及在
dune-project
文件中编写的不同沙丘版本(尽管我没有尝试手动下载特定的 dune
版本,但我不确定这会自动发生),我全局安装的 dune
版本是最新的,3.10。
下面的这组特定说明是在空目录中尝试的,并遵循 dune 官方文档的说明。
~> echo '(lang dune 3.10)' > dune-project
~> echo '(executable
(name hello_world)
(libraries core)
(preprocess (pps ppx_jane)))' > dune
~> echo 'open Core
let () =
Sexp.to_string_hum [%sexp ([3;4;5] : int list)]
|> print_endline' > hello_world.ml'
~> dune build
File "dune", line 3, characters 12-16:
3 | (libraries core)
^^^^
Error: Library "core" not found.
-> required by _build/default/hello_world.exe
-> required by alias all
-> required by alias default
File "dune", line 4, characters 18-26:
4 | (preprocess (pps ppx_jane)))
^^^^^^^^
Error: Library "ppx_jane" not found.
-> required by _build/default/hello_world.pp.ml
-> required by alias all
-> required by alias default
我收到的错误始终与从未找到的依赖项有关。我尝试复制其他项目,运行具有不同依赖项集的其他教程等等,但总是出现相同的错误。我尝试手动干预
.opam
文件,但看起来 dune
只是忽略并重写它。
在没有任何依赖项的情况下运行项目效果很好。
Opam 是 OCaml 的包管理器,其作用是安装依赖项。
另一方面,Dune 是一个构建系统。两者的角色截然不同。
运行
dune build
会给您带来缺少依赖项的错误,但它应该 also 更新项目的 opam 文件,允许您使用 opam install . --deps-only
安装所需的依赖项。完成此操作后,只要缺少的依赖项是唯一的错误来源,dune build
就应该成功。