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 .