Пакеты сборки#

Модуль в платформе представляет собой логически неделимую совокупность функциональности, которая может быть включена в различные прикладные проекты. Каждый модуль физически располагается в отдельной директории и может быть разделён на несколько пакетов сборки

Пакеты сборки (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, так как последний содержит общие классы;

  • Все внешние библиотеки должны быть добавлены в модуль либо в соответствующий пакет сборки.