OCaml 沙丘:获取源目录的绝对路径

问题描述

我有一个项目,它的根目录中有一个 ./tests 目录,其中包含数百 MB 的数据,供多个库的测试使用:

./tests
./src/lib1/dune
./src/lib1/tests/dune
./src/lib1/tests/tests.ml
./src/lib2/dune
./src/lib2/tests/dune
./src/lib2/tests/tests.ml
...

我还为每个库定义了使用 ./tests 中的数据的测试,如下所示:

(rule
 (alias runtest)
 (action (run ./tests/tests.exe)))

我现在必须以某种方式将测试数据的位置传达给我的每个 tests.exe。使用沙丘最优雅的方法是什么?

似乎沙丘将我的测试数据复制到 _build 中,这是不必要的,因为数据永远不会改变,这样浪费数百 MB 空间是没有意义的。从文档看来,%{project_root} 将包含我的源文件的路径,但不幸的是,该变量的计算结果为 .,这对于在 cd _build/default/src/libX 之后运行的测试毫无用处,因此 { {1}} 不再指向项目根目录。那么有没有一种沙丘方式来指定原始源目录的路径而没有丑陋的黑客攻击?

现在,我在运行 . 之前使用了包含完整路径的环境变量,但是否有更集成的方法

解决方法

我自己没有尝试过,但听起来 data_only_dirs 节正是您要找的:https://dune.readthedocs.io/en/stable/dune-files.html#data-only-dirs-since-1-6