Позбавляємося від бінарних залежностей з композитної складанням в Gradle 3.1

З самого появи Gradle існувало 2 способу розбити свою збірку на компоненти: через бінарні залежності і з допомогою многопроектной складання. Кожен з цих способів має свої плюси і мінуси. У випадку з бінарними залежностями виникає необхідність у публікації артефактів, що ускладнює. У разі використання многопроектной збірки стає
складніше ізолювати компоненти один від одного.
Композитні складання
готується до релізу версії 3.1 в Gradle з'являється новий похід до організації збірок, які складаються із декількох компонентів: композитні складання (ориг. Composite Builds).
Композитні складання дозволяють:
  • Швидко підкласти виправлену версію исходников бібліотеки в інший проект, без необхідності збирати її, опубліковувати і правити складання.
  • Ділити великі проекти на кілька невеликих, ізольованих збірок, над кожною з яких можна працювати як окремо, так і одночасно.
  • Відокремити розробку плагіна для системи збирання від проекту, його використовує (аналог
    buildSrc
    )

Розберемо простий приклад використання нової можливості.
Для цього створимо простенький проектик:
--app/
|-src/main/java/Main.java
|-build.gradle
- lib/
|-src/main/java/A.java
|-build.gradle
|-settings.gradle

lib/build.gradle:

apply plugin: 'java'

group "ru.shadam"
version "1.0"

task wrapper(type: Wrapper) {
gradleVersion = '3.1-rc-1'
}

app/build.gradle

apply plugin: 'java'
apply plugin: 'application'

mainClassName='Main'

dependencies {
compile 'ru.shadam:lib1:1.0'
}

task wrapper(type: Wrapper) {
gradleVersion = '3.1-rc-1'
}

Тепер, якщо ми спробуємо запустити
app
з допомогою команди
./gradlew run
Gradle буде лаятися на недозволену залежність:
$ ./gradlew run
:compileJava
FAILURE: Build failed with an exception.

* What went wrong:
Could not resolve all dependencies for configuration ':compileClasspath'.
> Cannot resolve external dependency ru.shadam:lib1:1.0 because no repositories are defined.
Required by:
project :

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more output log.

BUILD FAILED

Total time: 1.027 secs

Але, якщо ми додамо новий прапор --include-build, то Gradle дозволить залежності автоматично:
$ ./gradlew run --include-build ../lib1
[composite-build] Configuring build: C:\Users\sala\projects\gradle-compose\lib1
:compileJava
:lib1:compileJava UP-TO-DATE
:lib1:processResources UP-TO-DATE
:lib1:classes UP-TO-DATE
:lib1:jar UP-TO-DATE
:compileJava UP-TO-DATE
:processResources UP-TO-DATE
:classes UP-TO-DATE
:run
Hello

BUILD SUCCESSFUL

Total time: 1.092 secs

Просунуті варіанти використання.
Вбудовуємо --include-build в скрипт
Представлений вище варіант більше підходить для одноразового використання — тут і зараз. Кожен раз вказувати прапори не хочеться — навіть якщо зашити їх у wrapper.
Для цього gradle пропонує використовувати конфігурацію з використанням settings.gradle. Так, зазначений вище прапор можна замінити за допомогою наступного settings.gradle:
includeBuild('../lib1')

Підстановки
Що якщо в проекті, який ви хочете включити не вказані координати артефакту? (група, версія)
На допомогу приходять підстановки:
includeBuild('../lib1') {
dependencySubstitution {
substitute('ru.shadam:lib1') with project(':')
}
}

Ця можливість дозволяє підставити будь-яку залежність на
ru.shadam:lib1
залежністю на проект
lib1
.
Залежності між завданнями
У разі композитної складання проекти ізольовані один від одного, тому не можна оголошувати залежності між збірками безпосередньо.
У зв'язку з цим з'явився новий синтаксис для доступу до включається збірок. Наприклад, можна визначити залежність від завдання включеної складання:
task run {
dependsOn gradle.includedBuild('lib1').task(':jar')
}

Що поки не працює?
  • Не підтримуються в якості включаються проекти, у яких є публікуються артифакты, які не відповідають конфігурації за замовчуванням. ссылка
  • Поки немає підтримки в IDE (але підтримується генерація проекту за допомогою команди
    ./gradlew idea
    )
  • Не підтримуються native builds.
Плани команди
  • Додати можливість викликати завдання безпосередньо з включених збірок.
  • Додати можливість паралельно виконувати включені складання
  • Додати виявлення змін включених у збірках, коли використовується прапор
    t
    .
  • Зробити неявний проект buildSrc включеної складанням.
Використані матеріали
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.