Skip to content

Commit 2d5fc8d

Browse files
authored
Merge pull request #178 from KuzminVik/update-gradle
Update gradle
2 parents 3b5b083 + 61517ae commit 2d5fc8d

11 files changed

Lines changed: 518 additions & 343 deletions

learning/gradle/build-environment.md

Lines changed: 34 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,21 @@ Gradle предоставляет некоторые механизмы наст
88
конкретных проектов.
99

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

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

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

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

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

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

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

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

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

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

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

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

5252
```bash
53-
# ~/.gradle/gradle.properties
53+
# ~/.gradle/gradle.properties
5454

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

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

7171
```bash
72-
# выделение памяти jvm
72+
# выделение памяти JVM
7373
org.gradle.jvmargs=-Xmx4096m
74-
# параметр отложенной конфигурации
75-
# это когда градл конфигурирует проект только в тот момент,
76-
# когда от проекта что-то потребовалось.
77-
# это должно ускорять работу гредла, но по факту до сих пор слабо поддерживается плагинами
74+
# параметр отложенной конфигурации (deprecated, вместо него используйте configuration cache)
75+
# Gradle конфигурирует проект, только когда от него что-то потребовалось
7876
org.gradle.configureondemand=false
7977
# параллельное выполнение задач (при возможности)
8078
org.gradle.parallel=true
81-
# включение кеширование сборок (для ускорения)
79+
# включение кэширования сборок (для ускорения)
8280
org.gradle.caching=true
81+
# включение configuration cache — даёт наибольший прирост скорости (доступен с Gradle 8.1)
82+
org.gradle.configuration-cache=true
8383

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

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

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

93-
# отключить предупреждение об использовании ios таргета
95+
# отключить static framework warning в moko-resources
96+
moko.resources.disableStaticFrameworkWarning=true
97+
98+
# отключить предупреждение об использовании iOS таргета
9499
# из mobile-multiplatform-gradle-plugin
95100
mobile.multiplatform.iosTargetWarning=false
96101

97102
# указание версии проекта для Android таргета
98103
# версия iOS таргета меняется в другом месте
99-
# это единственный кейс версионирования через gradle.properties
100-
# в проекте
104+
# это единственный кейс версионирования через gradle.properties в проекте
101105
VERSION_NAME=0.1.0
102106
VERSION_CODE=1
103107

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

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

126130
```bash
127-
./gradlew build -Dorg.gradle.jvmargs= #...
131+
./gradlew build -Dorg.gradle.jvmargs="-Xmx2g"
128132
```
129133

130134
:::important
@@ -142,7 +146,7 @@ wrapper'а:
142146
org.gradle.jvmargs=-Xmx8g
143147
```
144148

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

147151
```bash
148152
org.gradle.workers.max=3
@@ -157,10 +161,14 @@ org.gradle.workers.max=3
157161

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

160-
Также сильное влияние (помимо персонализированных настроек из предыдущего пункта) на скорость сборки
164+
Также сильное влияние на скорость сборки (помимо персонализированных настроек из предыдущего пункта)
161165
оказывают параметры:
162166
- `org.gradle.parallel=true`
163167
- `org.gradle.caching=true`
168+
- `org.gradle.configuration-cache=true` (доступен с Gradle 8.1)
169+
170+
Параметр `org.gradle.configureondemand` считается устаревшим (deprecated) — вместо него используйте
171+
configuration-cache, он даёт гораздо больший прирост скорости.
164172

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

learning/gradle/buildSrc.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,36 @@ sidebar_position: 6
44

55
# buildSrc
66

7+
`buildSrc` — это специальная директория в корне Gradle-проекта. Всё, что лежит в `buildSrc/src/main/kotlin`,
8+
автоматически компилируется и становится доступным в `build.gradle.kts` всех модулей проекта.
9+
10+
Раньше buildSrc был популярным способом вынести общие версии зависимостей:
11+
12+
```kotlin
13+
// buildSrc/src/main/kotlin/Deps.kt
14+
object Deps {
15+
const val coroutines = "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.10.2"
16+
}
17+
```
18+
19+
## Недостатки buildSrc
20+
21+
- Любое изменение в buildSrc **инвалидирует весь build cache** проекта — Gradle пересобирает всё с нуля
22+
- buildSrc не поддерживает номера версий и не публикуется — это часть проекта
23+
- С ростом проекта сборка buildSrc замедляется, так как не закеширована
24+
25+
## Альтернатива: convention plugins (рекомендуется)
26+
27+
Современный подход — выносить общую логику в convention plugins через `includeBuild` (отдельный
28+
Gradle-проект `build-logic`). Подробнее — в разделе [Convention plugins](./intro-gradle#convention-plugins-build-logic).
29+
30+
Преимущества:
31+
- Изменения в convention plugins **не трогают build cache** основного проекта
32+
- Convention plugins можно версионировать и публиковать
33+
- Поддерживаются плагином `kotlin-dsl`, дающим автодополнение в IDE
34+
35+
## Материалы
36+
737
<iframe src="//www.youtube.com/embed/QqqYzaOzq3A?list=PL6yFiPOVXVUi90sQ66dtmuXP-1-TeHwl5" frameborder="0" allowfullscreen width="675" height="380"></iframe>
838
<br/>
939
<br/>

learning/gradle/check-yourself.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ sidebar_position: 11
66

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

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

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

3737
### Задача N2
3838

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

4444
### Задача N3
4545

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

5050
### Задача N4
5151

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

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

58-
Coming soon
58+
Скоро появится

0 commit comments

Comments
 (0)