|
2 | 2 |
|
3 | 3 | **Dune** - самое популярное решение для сборки OCaml-проектов, оно глубоко интегрировано в экосистему языка, обладает современным функционалом (на подобие инкрементальной сборки, параллельности) и позволяет собирать как исполняемые программы, так и библиотеки, вызывать тесты.
|
4 | 4 |
|
5 |
| -- [Quick start](https://dune.readthedocs.io/en/stable/quick-start.html) |
| 5 | +> [!NOTE] Документация |
| 6 | +> |
| 7 | +> - [Официальный сайт проекта](https://dune.build) |
| 8 | +> - Стартовый туториал [Quick start](https://dune.readthedocs.io/en/stable/quick-start.html) |
6 | 9 |
|
7 |
| -Стоит понимать, Dune не занимается управлением пакетами (сторонних библиотек), она способна только их подключать. |
8 |
| -Для управления же используется пакетный менеджер [OPAM](./opam.md). |
| 10 | +> [!IMPORTANT] Управление зависимостями |
| 11 | +> Стоит понимать, Dune не занимается управлением пакетами (зависимостями). |
| 12 | +> Для этого используется пакетный менеджер [OPAM](./opam.md). |
9 | 13 |
|
10 | 14 | ## Базовые понятия
|
11 | 15 |
|
12 |
| -Проекты Dune состоят из компонентов. Компонент может быть |
| 16 | +Разработка происходит в рамках **проекта**, корень проекта определяется по файлу `dune-project`. Проект в свою очередь состоит из **компонентов**. |
13 | 17 |
|
14 |
| -- **Исполняемым** (executable) |
15 |
| -- **Библиотечным** (library) |
16 |
| -- **Тестом** (test) |
| 18 | +| Компонент | Описание | dune | |
| 19 | +| ---------- | ------------------------------------------ | ----------------- | |
| 20 | +| Executable | Содержит непосредственно исполняемый код | `(executable ..)` | |
| 21 | +| Library | Код для использования другими компонентами | `(library ..)` | |
| 22 | +| Test | Содержит тесты для компонентов | `(test ..)` | |
17 | 23 |
|
18 |
| -Проект содержит один или более компонент любого типа, которые могут зависеть друг от друга. |
| 24 | +### Компоненты |
19 | 25 |
|
20 |
| -Эти компоненты могут быть объеденины в пакеты для их последующего распространения. |
| 26 | +У компонента всегда есть имя (строфа `name`) по которому можно обращаться **внутри** проекта. |
| 27 | +Если вы хотите сделать компонент публичным, то вы должны дать ему публичное имя (строфа `public_name`) и указать в качестве пакета в `dune-project` (если требуется). |
21 | 28 |
|
22 |
| -## Автоматическое форматирование |
23 |
| - |
24 |
| -Для этого у вас должен быть установлен [`ocamlformat`](https://github.com/ocaml-ppx/ocamlformat). |
| 29 | +> [!TIP] Зависимости между компонентами |
| 30 | +> Если ваши компоненты зависят друг от друга, то явно указывайте к какому пакету они относятся. |
| 31 | +> В противном случае Dune будет выдавать ошибку с просьбой сделать подключаемый компонент публичным |
| 32 | +> при попытки подключить приватный библиотечный компонент к публичному библиотечному. |
25 | 33 |
|
26 |
| -```sh |
27 |
| -$ opam install ocamlformat |
28 |
| -``` |
| 34 | +> [!TIP] Публичные имена |
| 35 | +> Публичные имена могут содержать символ `-`, что является предпочтительным разделителем слов в названиях пакетов. Пример: |
| 36 | +> |
| 37 | +> ```dune |
| 38 | +> (library |
| 39 | +> (name cool_unix) |
| 40 | +> (public_name cool-unix)) |
| 41 | +> ``` |
29 | 42 |
|
30 |
| -После чего в корень проекта добавьте файл `.ocamlformat`: |
31 |
| - |
32 |
| -```sh |
33 |
| -$ touch .ocamlformat |
34 |
| -``` |
35 |
| - |
36 |
| -Этого достаточно, чтобы использовалось автоформатирование командами: |
37 |
| - |
38 |
| -```sh |
39 |
| -$ dune fmt # или dune build @fmt |
40 |
| -``` |
| 43 | +## Автоматическое форматирование |
41 | 44 |
|
42 |
| -Для настройки профиля и версии смотрите [документацию](https://dune.readthedocs.io/en/stable/howto/formatting.html). |
| 45 | +Смотрите статью про форматтер [ocamlformat](./ocamlformat.md). |
43 | 46 |
|
44 | 47 | ## Чтения файлов в тестах
|
45 | 48 |
|
@@ -110,3 +113,30 @@ Dune умеет в установку скомпилированных арте
|
110 | 113 | > (package) stanzas do not support all opam fields or complete syntax for dependency specifications. If the package you are adapting requires this, keep the corresponding opam fields in a pkg.opam.template file. See [Packages](https://dune.readthedocs.io/en/stable/reference/packages.html).
|
111 | 114 |
|
112 | 115 | Смотрите пример использования: [переопределение](https://github.com/mattjbray/ocaml-decoders/blob/master/decoders-msgpck.opam.template), [новые поля](https://github.com/dx3mod/repostbot/blob/master/repostbot.opam.template).
|
| 116 | + |
| 117 | +## Интеграция с LSP |
| 118 | + |
| 119 | +Реализация языкового сервера OCaml использует генерируемые при сборки Dune'ой файлы для своей работы. |
| 120 | +Это можно заметить при создания нового файла, который редактор будет помечать красным с просьбой обновить кеш (то есть собрать проект для получения необходимой информации о новом файле). |
| 121 | + |
| 122 | +Поэтому для повышения отзывчивости вы можете воспользоваться командой |
| 123 | + |
| 124 | +```sh |
| 125 | +$ dune build @check -w |
| 126 | +``` |
| 127 | + |
| 128 | +## Release-сборка проекта |
| 129 | + |
| 130 | +Можно так, но он вообще работает? |
| 131 | + |
| 132 | +```sh |
| 133 | +$ dune build --profile release |
| 134 | +# или |
| 135 | +$ dune build release |
| 136 | +``` |
| 137 | + |
| 138 | +::: details Мем |
| 139 | + |
| 140 | + |
| 141 | + |
| 142 | +::: |
0 commit comments