Это один, вероятно, не ответить на ваш вопрос полностью, но вот мой опыт относительно построения среды:
Я действительно ценю OASIS. Он имеет хороший набор функций, помогая не только создавать проект, но и писать документацию и поддерживать среду тестирования.
система сборки
- OASIS генерирует
setup.ml
файл из спецификации (_oasis
файл), который работает в основном в качестве строительного сценария. Он принимает -configure
, -build
, -test
, -distclean
флаги. Я довольно привык к ним при работе с разными GNU и другими проектами, которые обычно используют Makefiles, и я считаю удобным, что здесь можно использовать все из них автоматически.
- Makefiles. Вместо генерации
setup.ml
можно также создать Makefile со всеми описанными выше опциями.
Структура
Обычно мой проект, который построен OASIS имеет, по меньшей мере, три директории: src
, _build
, scripts
и tests
.
- В прежнем каталоге все исходные файлы хранятся в одном каталоге: файлы источника (.ml) и интерфейса (.mli) хранятся вместе. Может быть, если проект слишком велик, стоит добавить дополнительные подкаталоги.
- Каталог
_build
находится под воздействием системы сборки OASIS. Здесь хранятся исходные и объектные файлы, и мне нравится, что файлы сборки не мешают исходным файлам, поэтому я могу легко удалить их, если что-то пойдет не так.
- Я храню несколько сценариев оболочки в каталоге
scripts
. Некоторые из них предназначены для выполнения тестов и создания файлов интерфейса.
- Все входные и выходные файлы для тестов, которые я храню в отдельном каталоге.
Интерфейсы/Документация
Использование файлов интерфейса (.mli) имеет как преимущества, так и недостатки для меня. Это действительно помогает находить ошибки типа, но если у вас есть они, вы должны их редактировать и при внесении изменений или улучшений в свой код. Иногда забывание об этом вызывает неприятные ошибки.
Но главная причина, по которой мне нравятся интерфейсные файлы, - это документация. Я использую ocamldoc для генерации (OASIS поддерживает эту функцию с флагом -doc
) html с документацией автоматически. На мой взгляд, достаточно написать комментарии, описывающие каждую функцию в интерфейсе, и не вставлять комментарии в середине кода. В OCaml функции обычно короткие и сжатые, и если есть необходимость вставлять туда дополнительные комментарии, возможно, лучше разделить функцию.
Также обратите внимание на -i
flag for ocamlc
. Компилятор может автоматически генерировать файл интерфейса для модуля.
Тесты
я не нашел разумное решение для поддержки испытаний (я хотел бы иметь некоторые ocamltest
приложения), поэтому я использую свои собственные сценарии для выполнения и проверки случаев использования. К счастью, OASIS поддерживает выполнение пользовательских команд, когда setup.ml
запущен с флагом -test
.
Я не использую OASIS в течение длительного времени, и если кто-нибудь знает какие-либо другие интересные функции, я хотел бы также узнать о них.
Кроме того, вы не знаете о OPAM, это определенно стоит посмотреть. Без него установка и управление новыми пакетами - это кошмар.
Почему бы не асинхронно вместо lwt? Тогда нет необходимости в каких-либо камерах4. Кроме того, не использовать ocamlnet в любом месте? – rgrinberg
В двух местах вы говорите, что OCaml 4.01.0 делает что-то возможным. Можете ли вы указать, какая функция 4.01.0 делает это? Это улучшит ваш уже отличный ответ. Благодарю. –
@rginberg OCamlnet является монолитным, и его сетевые библиотеки не хорошо сочетаются с Lwt. Мы используем усеченную версию части Netstring OCamlnet, которая не зависит от кода C OCamlnet. –