Если посмотреть на типичный проект Котлин, то очень много внимания отнимает Gradle на технические вещи. Вместо одного файла целая пачка в самом корне проекта:
- gradle/
- buildSrc/
- build.gradle.kts
- gradle.properties
- gradlew
- gradlew.bat
- settings.gradle.kts
Может ли быть лучше? Да, на других платформах (TypeScript / Python) обычно 1 файл (и может еще 1 файл с точными версиями зависимостей). Да и в том же Maven 1 файл.
Вторая проблема: если у нас микросервисы, то таких проектов множество. И хорошо бы их обновлять, и как-то синхронизировать.
Что же делать? Идеально – новую билд-систему:
- 1-2 файла настроек
- оставить возможность легкого скриптования (почему не Maven)
- добавить разрешение зависимостей по SemVer как на других платформах
Но это долго, тяжело и вряд ли под силу одному человеку за несколько дней.
Поэтому более простой путь: на Gradle сверху навесим утилиту, которая будет генерировать файлы для Gradle. Так что движок будет использоваться Gradle, а работать непосредственно будем с kbre.
KBRE (Kotlin Build Rule Enforcer):
- генерирует файлы gradle (в том числе и обновляет их)
- генерирует новый проект
- минимальные технические детали (скорее как start.spring.io, чем как было в Gradle)
- самоуверенный: настроено под свои предпочтения, не для всех (иначе не получатся минимальные технические детали)
- легко настраиваемый: понятно, что предпочтения в разных организациях / подразделениях разные, так что это легко настраиваемо
- важно разделение на общие настройки и настройки проекта
- хранит настройки в ~/.kbre – рекомендуется их положить под git и сделать едиными для организации / подразделения
- явные версии в сгененированных файлах (тогда IDE легко может подсказывать, что зависимость устарела, но нужно править в kbre.yaml или ~/.kbre)
- потенциально можно все файлы Gradle-файлы добавить в gitignore, но пока что рекомендуется их сохранять в git, чтобы kbre работала только при изменении сборки, а не для самой сборки.
Пример файла настроек kbre.yaml:
group: com.example
artifact: demo
name: Demo
description: Demo app
preset: spring
type: root
extensions:
- webflux
- mysql
- redis
dependencies: |
implementation("as:asd:1.2.3")
extra: |
# any text
Структура ~/.kbre
:
preset1/
root/
extensions/
yaml/
gradle/
libs.versions.toml
deps.kts
extension2/
preset2/
Описание каталога настроек (краткое, подробнее в репозитории):
- Сначала идут пресеты (например, spring, cli, или ktor) – это как шаблоны в IDE
- Типы – root для корневого проекта, другие могут быть, например, для каких-то подпроектов Gradle
- Расширяния (extensions). Для каждого пресета свои. Позволяют подключать функционал: например, подключаем jooq со своими файлами в папке bin, зависимостями и кастомным кодом в
build.gradle.kts
.
Как поставить kbre:
cd ~
git clone https://github.com/stepin/kbre-default-config .krbe
alias kbre='docker run --rm -it -v $PWD:/data -w /data --user "$(id -u)" stepin/kbre'
kbre version
Репозитарий настроек по умолчанию: https://github.com/stepin/kbre-default-config
При создании репозитария для каждого функционала важно выбрать:
- является он обязательным или нет (выносить его в расширение или нет)
- он будет генерироваться только первый раз или постоянно (основная папка или с суффиксом
-new
)
Создаем новый проект:
mkdir my-app
cd my-app
cat > kbre.yaml << \EOF
group: name.stepin
artifact: myapp
name: My app
description: Some description
preset: spring
type: root
extensions:
- graphql
- postgres
- flyway
- jooq
- dokka
- jib
- local-dev
- systemd-deployment
variables:
REPO: 'http://localhost:3000/stepin/kotlin-bootstrap-app/src/branch/main/src/main/kotlin'
SONAR_HOST_URL: 'http://localhost:9000'
SONAR_PROJECT_KEY: kotlin-bootstrap-app
SONAR_PROJECT_NAME: kotlin-bootstrap-app
SONAR_TOKEN: sqp_821b1d3209761625bdd29259674237d429bce626
EOF
kbre new
Обновляем существующий проект:
cd my-app
kbre update
Проект: https://github.com/stepin/kbre