OCaml dune: получить абсолютный путь к исходному каталогу

#ocaml #ocaml-dune

#ocaml #ocaml-dune

Вопрос:

У меня есть проект, и в ./tests его корневом каталоге есть каталог, содержащий несколько сотен МБ данных, которые используются в тестах нескольких библиотек:

 ./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 . Какой самый элегантный способ сделать это с помощью dune?

Кажется, что dune копирует мои тестовые данные, в _build которые нет необходимости, потому что данные никогда не меняются, и нет смысла тратить таким образом несколько сотен МБ пространства. Из документации кажется, что %{project_root} это будет содержать путь к моим исходным файлам, но, к сожалению, переменная вычисляет . значение, которое бесполезно для тестов, которые выполняются после a cd _build/default/src/libX , и, следовательно . , больше не указывает на корень проекта. Итак, есть ли dune-способ указать путь к исходному исходному каталогу без уродливых взломов?

Прямо сейчас я использую переменную среды, содержащую полный путь перед запуском dune runtest , но есть ли более интегрированный способ?

Комментарии:

1. Это кажется актуальным: github.com/ocaml/dune/issues/2856

Ответ №1:

Я сам не пробовал, но похоже data_only_dirs , что строфа — это то, что вы ищете: https://dune.readthedocs.io/en/stable/dune-files.html#data-only-dirs-since-1-6

Комментарии:

1. Но как мои скрипты узнают, где находится каталог данных? Я каким-то образом должен передавать им эту информацию, когда dune их запускает.