我在 Dune 中构建了一个项目,其结构
| project_dir
-| bin
| dune
| main.ml
-| lib
| dune
| libfile.ml
-| test
| dune
| test.ml
| data.csv
libfile.ml
可以很好地读取data.csv
中的数据,其相对文件路径与当前工作目录平行(即,当main.ml
运行时,libfile.ml
在项目目录的根目录下找到data.csv
) .
但是,当我调用
dune test
时,它找不到该文件。 我尝试通过将文件添加到 ./test/dune
依赖项来解决此问题。 但这样做时,必须相对于 ./test
目录引用文件! 为了让测试找到文件,我需要给出路径../data.csv
。
基本上,一个文件路径用于运行,另一个文件路径用于测试。 我知道我可以使所有函数调用都采用文件路径参数并在不同位置指定不同路径,但我给出了该项目的非常简化的描述,因为它相当大。 考虑到项目的复杂性,如果我能够以某种方式控制测试或主执行的“当前工作目录”,这样我就可以使一个与另一个匹配,那就更好了。
感谢您的帮助!
Dune 不在当前目录运行测试,而是在测试的构建目录运行(例如
./_build/default/tests
)。
这就是为什么您在测试期间无法像
data.csv
那样从当前目录访问 bin/main.ml
文件。
我相信在测试中使用
<root-of-project>/data.csv
文件的最简单方法是使用沙丘的 依赖项规范 将其添加为测试依赖项。这样,dune 会将其复制到测试构建目录的父目录。
此外,Dune 将跟踪对 data.csv
文件的修改,确保您在测试中始终使用最新版本的 data.csv
并避免大多数不必要的复制。
文件
./test/dune
:
(test
(name test_so_answer)
(deps
; %{project_root} indicate project root according to https://dune.readthedocs.io/en/stable/concepts/variables.html
(file %{project_root}/data.csv)))
文件
./test/test_entry.ml
:
let () =
let path = "../data.csv" in
Printf.printf "File %s exists: %b\n" path (Sys.file_exists path)
运行测试:
dune test
你会得到:
File ../data.csv exists: true