如何在Dune构建中包含非OCaml/Reason文件?
解决Dune构建时包含测试资源文件的问题
你需要在test目录的dune文件中添加规则,让Dune将测试资源文件复制到_build目录中,有两种常用方式:
方式一:在Test Stanza中使用(data)字段
直接在定义测试的stanza里指定需要包含的资源文件,Dune会自动将这些文件复制到测试可执行文件所在的_build/test目录下:
(test (name tests) (libraries lib) (data test_files/*.txt))
这种方式下,测试代码里可以直接用文件名读取(比如"test_input1.txt"),因为文件会被放到和测试程序同一目录。
方式二:使用(copy_files) Stanza保留目录结构
如果希望在_build中保留test_files的目录结构,避免路径混乱,可以单独添加(copy_files)规则:
(test (name tests) (libraries lib)) (copy_files test_files/**)
此时测试代码需要用相对目录路径读取文件,比如:
let read_input file = let full_path = Filename.concat "test_files" file in In_channel.with_open_text full_path In_channel.input_all
补充说明
include_subdirs确实只用于扫描OCaml模块文件(.ml/.mli),不会处理文本这类非模块资源,所以必须用上述两种方法明确告诉Dune要复制这些文件。
内容的提问来源于stack exchange,提问作者Fluffy the Togekiss
相关产品推荐
相关产品推荐

