Статьи

Использование Gradle для загрузки ваших старых сборок Ant

Gradle предоставляет несколько различных способов использовать ваши существующие инвестиции в Ant, как с точки зрения накопленных знаний, так и времени, которое вы уже вложили в файлы сборки. Это может значительно облегчить процесс переноса собранных Ant-проектов в Gradle и может дать вам путь для постепенного выполнения этого. Документация Gradle хорошо описывает, как вы можете использовать Ant в своем скрипте сборки Gradle, но вот краткий обзор и некоторые подробности, с которыми я столкнулся.

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, если вы хотите поближе познакомиться.

Похожие сообщения:

  1. Почему я люблю Gradle?
  2. Groovy / Gradle Плагин JSLint
  3. Пять классных вещей, которые вы можете сделать с помощью скриптов Groovy

Ссылка: Использование Gradle для начальной загрузки ваших предыдущих сборок Ant от нашего партнера по JCG Келли Робинсон в блоге The Kaptain on… stuff .