Skip to content
60 changes: 34 additions & 26 deletions learning/gradle/build-environment.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,21 @@ Gradle предоставляет некоторые механизмы наст
конкретных проектов.

Параметры Gradle можно установить в четырех разных местах:
- Глобально - глобальные свойства применяются на уровне пользователя или системы. Целью глобальных свойств является применение общих настроек в нескольких проектах Gradle. Например, использование глобально применяемых паролей упрощает обслуживание и устраняет необходимость копирования паролей в несколько областей.
- Глобально глобальные свойства применяются на уровне пользователя или системы. Целью глобальных свойств является применение общих настроек в нескольких проектах Gradle. Например, использование глобально применяемых паролей упрощает обслуживание и устраняет необходимость копирования паролей в несколько областей.

Такие параметры хранятся в директории `.gradle` папки вашей учетной записи, например на Mac это `~/.gradle/gradle.properties`.
- В проекте - свойства проекта применяются ко всему проекту Gradle, например, к проекту moko-template.
Такие параметры хранятся в директории `.gradle` папки вашей учетной записи, например, на Mac это `~/.gradle/gradle.properties`.
- В проекте свойства проекта применяются ко всему проекту Gradle, например, к проекту moko-template.
Используйте свойства на уровне проекта для управления поведением Gradle по всему проекту.
Например, можно указать необходимые переменные, будет ли кешироваться сборка, ну или включить "отложенную конфигурацию" проекта.

Эти параметры хранятся в `gradle.properties` проекта.
- В module - "модульные" свойства применяются к одному модулю в проекте. Например, вы можете использовать свойства уровня модуля для хранения адресов доступа к api.
- В модуле — «модульные» свойства применяются к одному модулю в проекте. Например, вы можете использовать свойства уровня модуля для хранения адресов доступа к api.

Модульные параметры хранятся в `gradle.properties` конкретного модуля проекта, например, `moko-template/android-app`.
- В командной строке, например: -Dorg.gradle.java.home, этот флаг указывает директорию используемого jdk. Флаги командной строки имеют приоритет над свойствами и переменными среды.
- В командной строке, например, `-Dorg.gradle.java.home` — флаг указывает директорию используемого JDK. Флаги командной строки имеют приоритет над свойствами и переменными среды.
Альтернатива — Gradle Toolchains: в `build.gradle.kts` можно указать `kotlin { jvmToolchain(17) }`, и Gradle сам найдёт подходящий JDK.

Файл `gradle.properties` состоит из пар ключ-значение параметров настройки запуска Gradle. Использование `gradle.properties` это альтернатива использованию флагов командной строки для конфигурации проекта.
Файл `gradle.properties` состоит из пар ключ-значение параметров настройки запуска Gradle. Использование `gradle.properties` это альтернатива использованию флагов командной строки для конфигурации проекта.

:::info
Также вместо параметров в файле `gradle.properties` вы можете указывать переменные вашего Gradle-окружения.
Expand All @@ -32,7 +33,7 @@ Gradle предоставляет некоторые механизмы наст
Как мы уже выяснили, файл глобальных свойств должен находиться в вашем домашнем каталоге:

- В Windows: `C:\Users\<you>\.gradle\gradle.properties`
- На Mac/Linux: `~\.gradle\gradle.properties`
- На Mac/Linux: `~/.gradle/gradle.properties`

Следующие свойства могут быть использованы для настройки среды сборки Gradle:

Expand All @@ -42,17 +43,16 @@ Gradle предоставляет некоторые механизмы наст
- ***org.gradle.daemon=(true,false)***
- ***org.gradle.daemon.idletimeout=(# of idle millis)***

Прочитать об этих параметрах и найти остальные можете [тут](https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_configuration_properties).
Прочитать об этих параметрах и найти остальные можете [тут](https://docs.gradle.org/current/userguide/build_environment.html#sec:gradle_configuration_properties).

Параметры, объявленные глобально, будут применены для любого запущенного от текущего пользователя
Gradle проекта.
Параметры, объявленные глобально, будут применены для любого запущенного от текущего пользователя Gradle проекта.

Рассмотрим пример:

```bash
# ~/.gradle/gradle.properties
# ~/.gradle/gradle.properties

# На запуск jvm будет выделено 6 GB памяти
# На запуск JVM будет выделено 6 GB памяти
org.gradle.jvmargs=-Xmx6g

# максимальное количество "воркеров" делаем равным трем
Expand All @@ -69,39 +69,43 @@ org.gradle.workers.max=3
Например, в нашем [boilerplate-проекте](https://gitlab.icerockdev.com/scl/boilerplate/mobile-moko-boilerplate) используются такие параметры:

```bash
# выделение памяти jvm
# выделение памяти JVM
org.gradle.jvmargs=-Xmx4096m
# параметр отложенной конфигурации
# это когда градл конфигурирует проект только в тот момент,
# когда от проекта что-то потребовалось.
# это должно ускорять работу гредла, но по факту до сих пор слабо поддерживается плагинами
# параметр отложенной конфигурации (deprecated, вместо него используйте configuration cache)
# Gradle конфигурирует проект, только когда от него что-то потребовалось
org.gradle.configureondemand=false
# параллельное выполнение задач (при возможности)
org.gradle.parallel=true
# включение кеширование сборок (для ускорения)
# включение кэширования сборок (для ускорения)
org.gradle.caching=true
# включение configuration cache — даёт наибольший прирост скорости (доступен с Gradle 8.1)
org.gradle.configuration-cache=true

# использовать официальный стандарт кода
kotlin.code.style=official

# плагин Android будет использовать библиотеку AndroidX вместо стандартной библиотеки
android.useAndroidX=true

# отключить предупреждения о том, что технология mpp является экспериментальной
# формат директорий android source set (version=2 значит src/androidMain/kotlin)
kotlin.mpp.androidSourceSetLayoutVersion=2
# отключить предупреждения о нестабильности мультиплатформы (KMP стабилен с 2023 года)
kotlin.mpp.stability.nowarn=true

# отключить предупреждение об использовании ios таргета
# отключить static framework warning в moko-resources
moko.resources.disableStaticFrameworkWarning=true

# отключить предупреждение об использовании iOS таргета
# из mobile-multiplatform-gradle-plugin
mobile.multiplatform.iosTargetWarning=false

# указание версии проекта для Android таргета
# версия iOS таргета меняется в другом месте
# это единственный кейс версионирования через gradle.properties
# в проекте
# это единственный кейс версионирования через gradle.properties в проекте
VERSION_NAME=0.1.0
VERSION_CODE=1

# переменная, хранящая путь до нашего xcode-проекта
# переменная, хранящая путь до нашего Xcode-проекта
xcodeproj=ios-app/ios-app.xcworkspace
```

Expand All @@ -124,7 +128,7 @@ xcodeproj=ios-app/ios-app.xcworkspace
wrapper'а:

```bash
./gradlew build -Dorg.gradle.jvmargs= #...
./gradlew build -Dorg.gradle.jvmargs="-Xmx2g"
```

:::important
Expand All @@ -142,7 +146,7 @@ wrapper'а:
org.gradle.jvmargs=-Xmx8g
```

При настройке этого параметра стоит учитывать количество ОЗУ на вашем устройстве и оставлять пару резервных ГБ. Например, если на устройстве у вас 16 ГБ ОЗУ, то можете спокойно выделять 8 ГБ на работу Java-машины, остальной памяти вам будет достаточно, чтобы комфортно пользоваться устройством во время сборки проекта. Если вы не будете выставлять этот параметр ни в проекте, ни глобально, то Gradle по умолчанию выставит `-Xmx512m`.
При настройке этого параметра стоит учитывать количество ОЗУ на вашем устройстве и оставлять пару резервных ГБ. Например, если на устройстве у вас 16 ГБ ОЗУ, то можете спокойно выделять 8 ГБ на работу Java-машиныостальной памяти вам будет достаточно, чтобы комфортно пользоваться устройством во время сборки проекта. Если вы не будете выставлять этот параметр ни в проекте, ни глобально, то Gradle по-умолчанию выставит `-Xmx512m`.

```bash
org.gradle.workers.max=3
Expand All @@ -157,10 +161,14 @@ org.gradle.workers.max=3

## Влияет на скорость сборки

Также сильное влияние (помимо персонализированных настроек из предыдущего пункта) на скорость сборки
Также сильное влияние на скорость сборки (помимо персонализированных настроек из предыдущего пункта)
оказывают параметры:
- `org.gradle.parallel=true`
- `org.gradle.caching=true`
- `org.gradle.configuration-cache=true` (доступен с Gradle 8.1)

Параметр `org.gradle.configureondemand` считается устаревшим (deprecated) — вместо него используйте
configuration-cache, он даёт гораздо больший прирост скорости.

Данные параметры должны быть указаны в проектных настройках, чтобы они применялись у всех разработчиков.

Expand Down
30 changes: 30 additions & 0 deletions learning/gradle/buildSrc.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,36 @@ sidebar_position: 6

# buildSrc

`buildSrc` — это специальная директория в корне Gradle-проекта. Всё, что лежит в `buildSrc/src/main/kotlin`,
автоматически компилируется и становится доступным в `build.gradle.kts` всех модулей проекта.

Раньше buildSrc был популярным способом вынести общие версии зависимостей:

```kotlin
// buildSrc/src/main/kotlin/Deps.kt
object Deps {
const val coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2"
}
```

## Недостатки buildSrc

- Любое изменение в buildSrc **инвалидирует весь build cache** проекта — Gradle пересобирает всё с нуля
- buildSrc не поддерживает номера версий и не публикуется — это часть проекта
- С ростом проекта сборка buildSrc замедляется, так как не закеширована

## Альтернатива: convention plugins (рекомендуется)

Современный подход — выносить общую логику в convention plugins через `includeBuild` (отдельный
Gradle-проект `build-logic`). Подробнее — в разделе [Convention plugins](./intro-gradle#convention-plugins-build-logic).

Преимущества:
- Изменения в convention plugins **не трогают build cache** основного проекта
- Convention plugins можно версионировать и публиковать
- Поддерживаются плагином `kotlin-dsl`, дающим автодополнение в IDE

## Материалы

<iframe src="//www.youtube.com/embed/QqqYzaOzq3A?list=PL6yFiPOVXVUi90sQ66dtmuXP-1-TeHwl5" frameborder="0" allowfullscreen width="675" height="380"></iframe>
<br/>
<br/>
Expand Down
20 changes: 10 additions & 10 deletions learning/gradle/check-yourself.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ sidebar_position: 11

## Практические задачи

Результатом выполнения следующих задач должен быть репозиторий на https://github.com /
Результатом выполнения следующих задач должен быть репозиторий на https://github.com или
https://gitlab.icerockdev.com с 4 ветками (каждое задание в своей ветке).

Полное выполнение задач можно посмотреть в видео Gradle с нуля. Более детальная информация в конкретных страницах раздела Gradle (смотрите по названиям).
Expand All @@ -25,34 +25,34 @@ https://gitlab.icerockdev.com с 4 ветками (каждое задание
6. Добавить AuthViewModel и ProfileViewModel (с использованием moko-mvvm) в соответствующие фичи
7. Сделать в mpp-library фабрику для создания этих вьюмоделей
8. Вызвать из android-app создание вьюмоделей
9. Сделать компиляцию mpp-library в ios framework
10. Сделать ios-app xcode проект
9. Сделать компиляцию mpp-library в iOS framework
10. Сделать ios-app Xcode проект
11. Настроить интеграцию ios-app с mpp-library через cocoapods
12. Вызвать в ios-app создание вьюмоделей
13. Сделать gradle task которая выводит все sourceSet’ы проекта (задача должна быть доступна во всех подпроектах)
13. Сделать gradle task, которая выводит все sourceSet’ы проекта (задача должна быть доступна во всех подпроектах)
14. Сделать sh скрипт для максимально быстрой проверки компилируемости обоих приложений и мультиплатформы
15. Сделать sh скрипт для максимально быстрой проверки компилируемости андроид приложения
16. Сделать sh скрипт для максимально быстрой проверки компилируемости ios приложения

### Задача N2

1. Взять проект-результат задачи N1
2. Вынести зависимости (моко мввм и другие подключенные, если есть) в Deps объект внутри buildSrc
3. Тамже завести Modules объект с указанием путей до всех модулей
4. Подключить новые константы вместо хардкод-строк и убедиться что все работает
2. Вынести зависимости (moko-mvvm и другие подключенные, если есть) в Deps объект внутри buildSrc
3. Там же завести Modules объект с указанием путей до всех модулей
4. Подключить новые константы вместо хардкод-строк и убедиться, что все работает

### Задача N3

1. Взять проект-результат задачи N1
2. Выделить повторяющуюся между подпроектами логику в convention плагины внутри composite build’а (не buildSrc)
3. Подключить convention плагины и убедиться что все работает
3. Подключить convention плагины и убедиться, что все работает

### Задача N4

1. Взять проект-результат задачи N1
2. Вынести зависимости в version catalog, а подпроекты связать через projects accessors
3. Подключить вместо хардкод строк новые константы и убедиться что все работает
3. Подключить вместо хардкод строк новые константы и убедиться, что все работает

## Тестирование

Coming soon
Скоро появится
Loading
Loading