Gradle AntBuilder
Каждый Gradle Project включает в себя экземпляр AntBuilder, делающий все возможности Ant доступными в ваших файлах сборки. Gradle предоставляет простое расширение существующего Groovy AntBuilder, которое добавляет простой, но мощный способ взаимодействия с существующими файлами сборки Ant: метод importBuild (Object antBuildFile) . Внутренне этот метод использует Ant ProjectHelper для анализа указанного файла сборки Ant, а затем оборачивает все цели в задачи Gradle, делая их доступными в сборке Gradle. Ниже приведен простой файл сборки Ant, используемый для иллюстрации, который содержит некоторые свойства и несколько зависимых целей.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
|
<? xml version = '1.0' ?> < project name = 'build' default = 'all' > < echo >Building ${ant.file}</ echo > < property file = 'build.properties' /> < property name = 'root.dir' location = '.' /> < target name = 'dist' description = 'Build the distribution' > < property name = 'dist.dir' location = 'dist' /> < echo >dist.dir=${dist.dir}, foo=${foo}</ echo > </ target > < target name = 'all' description = 'Build everything' depends = 'dist' /> </ project > |
Импорт этого файла сборки с использованием Gradle является однострочным.
1
|
ant.importBuild( 'src/main/resources/build.xml' ) |
И вывод командных задач — все в командной строке показывает, что цели были добавлены в задачи сборки.
1
2
3
4
5
6
7
|
$ gradle tasks --all ... Other tasks ----------- all - Build everything dist - Build the distribution ... |
Свойства, используемые в файле сборки Ant, можно указать в сборке Gradle или в командной строке, и, в отличие от обычного поведения свойств Ant, свойства, установленные Ant или в командной строке, могут быть перезаписаны Gradle. Учитывая простой файл build.properties с foo = bar в качестве единственной записи, вот несколько комбинаций, чтобы продемонстрировать поведение переопределения.
Вызов командной строки | Конфигурация Gradle Build | эффект | Результат |
---|---|---|---|
Gradle Dist | ant.importBuild ( ‘SRC / главная / ресурсы / build.xml’) | Используется значение build.properties, загруженное из сборки ant | Foo = бар |
gradle dist -Dfoo = NotBar | ant.importBuild ( ‘SRC / главная / ресурсы / build.xml’) | свойство командной строки используется | Foo = NotBar |
gradle dist -Dfoo = NotBar | ant.foo = ‘NotBarFromGradle’ ant.importBuild ( ‘SRC / главная / ресурсы / build.xml’) |
Используется свойство сборки Gradle | Foo = NotBarFromGradle |
gradle dist -Dfoo = NotBar | ant.foo = ‘NotBarFromGradle’ ant.importBuild ( ‘SRC / главная / ресурсы / build.xml’) ant.foo = ‘NotBarFromGradleAgain’ |
Используется переопределение свойства сборки Gradle | Foo = NotBarFromGradleAgain |
Как бороться с конфликтами имен задач
Поскольку Gradle настаивает на уникальности имен задач, попытка импортировать сборку Ant, которая содержит цель с тем же именем, что и существующая задача Gradle, не удастся. Самым распространенным конфликтом, с которым я столкнулся, является чистая задача, предоставляемая Gradle BasePlugin. С помощью небольшой косвенности мы все еще можем импортировать и использовать любые конфликтующие цели, используя задачу GradleBuild для начальной загрузки импорта сборки Ant в изолированном проекте Gradle. Давайте добавим новую задачу в смесь в импортированной сборке Ant и еще одну зависимость от цели ant clean для всей задачи.
1
2
3
4
5
|
<!-- excerpt from buildWithClean.xml Ant build file --> < target name = 'clean' description = 'clean up' > < echo >Called clean task in ant build with foo = ${foo}</ echo > </ target > < target name = 'all' description = 'Build everything' depends = 'dist,clean' /> |
И простой файл сборки Gradle, который будет обрабатывать импорт.
1
|
ant.importBuild( 'src/main/resources/buildWithClean.xml' ) |
Наконец, в нашем основном файле сборки Gradle мы добавляем задачу для запуска желаемых целей.
1
2
3
4
|
task importTaskWithExistingName(type: GradleBuild) { GradleBuild antBuild -> antBuild.buildFile = 'buildWithClean.gradle' antBuild.tasks = [ 'all' ] } |
Это работает, но, к сожалению, страдает одной маленькой проблемой . Когда Gradle импортирует эти задачи, он не выполняет должным образом объявленный порядок зависимостей. Вместо этого он выполняет зависимые цели муравья в алфавитном порядке. В этом конкретном случае Ant ожидает выполнения цели dist до очистки, а Gradle выполняет их в обратном порядке. Это можно обойти, явно указав порядок задач, определенно не идеальный, но выполнимый. Эта задача Gradle будет выполнять основные цели Ant так, как нам нужно.
1
2
3
4
|
task importTasksRunInOrder(type: GradleBuild) { GradleBuild antBuild -> antBuild.buildFile = 'buildWithClean.gradle' antBuild.tasks = [ 'dist' , 'clean' ] } |
Правила Gradle для отдыха
Наконец, вы можете использовать правило Gradle, чтобы разрешить вызов любой произвольной цели в импорте начальной загрузки GradleBuild.
1
2
3
4
5
6
7
8
|
tasks.addRule( 'Pattern: a-<target> will execute a single <target> in the ant build' ) { String taskName -> if (taskName.startsWith( 'a-' )) { task(taskName, type: GradleBuild) { buildFile = 'buildWithClean.gradle' tasks = [taskName - 'a-' ] } } } |
В этом конкретном примере это также может позволить объединить вызовы, но имейте в виду, что они выполняются в полностью изолированных средах.
1
|
$ gradle a-dist a-clean |
Исходный код
Весь код, указанный в этой статье, доступен на github, если вы хотите поближе познакомиться.
Похожие сообщения:
- Почему я люблю Gradle?
- Groovy / Gradle Плагин JSLint
- Пять классных вещей, которые вы можете сделать с помощью скриптов Groovy
Ссылка: Использование Gradle для начальной загрузки ваших предыдущих сборок Ant от нашего партнера по JCG Келли Робинсон в блоге The Kaptain on… stuff .