Пакеты сборки#
Модуль в платформе представляет собой логически неделимую совокупность функциональности, которая может быть включена в различные прикладные проекты. Каждый модуль физически располагается в отдельной директории и может быть разделён на несколько пакетов сборки
Пакеты сборки (build packets) — механизм изоляции частей модуля для управления зависимостями и ускорения компиляции. Этот документ описывает типы пакетов, их назначение и структуру.
Назначение пакетов сборки#
Пакет сборки определяет набор артефактов (исходный код, ресурсы) и зависимостей, которые группируются вместе. Каждый пакет сборки выпускается с версией модуля, в состав которого он входит.
Разделение на пакеты позволяет:
изолировать контракты от реализации;
управлять областью видимости типов (например, core-пакет может содержать классы и трейты, доступные для наследования в других модулях);
уменьшить перекомпиляцию при изменениях (контракты меняются реже, чем реализация).
Базовые пакеты сборки#
Для большинства модулей рекомендуется использовать три стандартных пакета:
core— содержит классы и трейты, от которых может зависеть реализация других модулей (например, базовые абстрактные классы, case-классы, общие утилиты). Код в этом пакете компилируется обычным образом и может использоваться в других модулях как обычная библиотека;contracts— содержит только контракты (интерфейсы на Api, Pkg, Lib), которые будут использоваться для разрыва бинарной зависимости между модулями;src— также является пакетом сборки, который содержит внутренние классы модуля, не используемые в других пакетах сборки или модулях.
Структура пакетов сборки#
btk/ # корень модуля
├── contracts/ # пакет btk_contracts
│ ├── src/main/scala/ # исходники контрактов
│ └── build.sbt # настройки пакета
├── core/ # пакет btk_core
│ ├── src/main/scala/ # реализация, core-классы
│ └── build.sbt
├── src/ # базовый код модуля
│ └── main/scala/ # реализация
├── build.sbt # сборка всего модуля (агрегация пакетов)
└── buildPackets.yaml # конфигурация пакетов сборки
Настройка пакетов сборки модуля#
В файле конфигурации пакетов сборки (buildPackets.yaml) указывается список пакетов и флаг генерации контрактов:
# Флаг о необходимости генерировать контракты для данного модуля.
shouldGenerateContract: true
# Пакеты сборки модуля
packets:
- name: btk_contracts
- name: btk_core
Описание сборки в build.sbt
Для корректной сборки модуля используется агрегация пакетов сборки в корневом build.sbt:
import ru.bitec.app.gtk.sbt.{Build, CommonSetting, ScalaVersionNames}
// пакеты сборки
lazy val btk_contracts = project in file("contracts")
lazy val btk_core = project in file("core")
// Модуль – агрегирует пакеты сборки и задаёт общие зависимости
lazy val btk = (project in file("."))
.aggregate(btk_contracts, btk_core) // Агрегация пакетов сборки
.dependsOnGsfModules("gtk") // Зависимость от модуля gtk
.dependsOnBuildPacket("btk_contracts") // Зависимость модуля от пакетов сборки
.settings(CommonSetting.setting *)
.settings(
name := "btk"
)
build.sbt для пакета btk_core (btk/core/build.sbt):
import ru.bitec.app.gtk.sbt.{Build, CommonSetting, ScalaVersionNames}
lazy val btk_core = (project in file("."))
.dependsOnGsfModules("gtk")
.settings(CommonSetting.setting *)
.settings(
name := "btk_core", // Наименование пакета сборки
publish / skip := true
)
build.sbt для пакета btk_contracts (btk/contracts/build.sbt):
import ru.bitec.app.gtk.sbt.{Build, CommonSetting, ScalaVersionNames}
lazy val btk_contracts = (project in file("."))
.dependsOnGsfModules("gtk")
.dependsOnBuildPacket("btk_core") // contracts зависит от пакета сборки core
.settings(CommonSetting.setting *)
.settings(
name := "btk_contracts", // Наименование пакета сборки
publish / skip := true
)
Проектные модули#
Примечание
Модули делятся на две категории:
Коробочные (gtk, btk, stm) — поставляются платформой, используют пакеты сборки;
Проектные (префикс
z, напримерzSng,zSvs) — создаются под конкретное решение.
Проектные модули не разделяются на пакеты сборки и не используют контракты, поэтому правки в них вносить не надо. Все проектные модули зависят от коробочного модуля целиком, наследуя все его пакеты сборки.
В build.sbt при наследовании от модуля dependsOnGsfModules наследуются и все пакеты сборки. Пример:
import ru.bitec.app.gtk.sbt.{Build, CommonSetting, ScalaVersionNames}
lazy val zbtk = (project in file("."))
.dependsOnGsfModules("gtk", "btk")
.settings(CommonSetting.setting *)
Модуль zbtk наследуется от модуля btk, поэтому может использовать код из пакетов сборки core, contracts и всех остальных.
Примечание#
Пакет
contractsне должен содержать реализацию, только автоматически генерируемые контракты;Пакет
contractsзависит отcore, так как последний содержит общие классы;Все внешние библиотеки должны быть добавлены в модуль либо в соответствующий пакет сборки.