- PVSM.RU - https://www.pvsm.ru -
С самого появления 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
apply plugin: 'java'
group "ru.shadam"
version "1.0"
task wrapper(type: Wrapper) {
gradleVersion = '3.1-rc-1'
}
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 log output.
BUILD FAILED
Total time: 1.027 secs
Но, если мы добавим новый флаг --include-build, то Gradle разрешит зависимости автоматически:
$ ./gradlew run --include-build ../lib1
[composite-build] Configuring build: C:Userssalaprojectsgradle-composelib1
: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')
}
./gradlew idea
)-t
.Автор: saladinkzn
Источник [4]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/java/187350
Ссылки в тексте:
[1] ссылка: https://docs.gradle.org/3.1-rc-1/userguide/composite_builds.html#included_build_substitution_limitations
[2] Документация: https://docs.gradle.org/3.1-rc-1/userguide/composite_builds.html
[3] Репозиторий с примерами: https://github.com/saladinkzn/gradle-compose
[4] Источник: https://habrahabr.ru/post/309938/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best
Нажмите здесь для печати.