Статьи

Муравей или Гант?

Да, именно об этом меня часто спрашивают мои клиенты и многие разработчики. Нелегко ответить на этот вопрос. Есть несколько проектов, использующих Ant. Стоит ли убегать от Ant только потому, что там есть новый крутой инструмент под названием Gant? Стоит ли переходить на Гант только потому, что вам не нравится XML? Не за что. Давайте внимательнее посмотрим, что может заставить вас переключиться на Ганта.

Когда выбрать Ганта?

1. Сложные файлы сборки. Если ваши файлы сборки ant становятся слишком сложными и сложными в управлении, пришло время посмотреть, поможет ли использование Gant. Позвольте мне объяснить, что я имею в виду под сложными файлами сборки. Если в ваших файлах сборки слишком много условной логики, скажите что-то похожее в строках, показанных ниже в листинге 1:

Листинг 1:

    <if>
<isset property="sqlserver"/>
<then>
<do something here/>
</then>
</if>
<if>
<isset property="oracle"/>
<then>
<do something else here/>
</then>
</if>
<if>
<isset property="derby"/>
<then>
<do something for derby here/>
</then>
</if>
<if>
<isset property="db2"/>
<then>
<do something for db2 here/>
</then>
</if>

 Или даже что-то вроде этого, где вы можете поддерживать развертывание на разных серверах приложений на основе какого-либо свойства в ваших build.properties, как показано в листинге 2.

Листинг 2:

    <if>
<isset property="server.jboss4"/>
<then>
<deploy to JBoss 4/>
</then>
<elseif>
<isset property="server.weblogic10"/>
<then>
<deploy to web logic/>
</then>
</elseif>
<elseif>
<isset property="server.glassfish"/>
<then>
<deploy to GlassFish/>
</then>
</elseif>
<elseif>
<isset property="server.someother version"/>
<then>
<deploy to this some other version/>
</then>
</elseif>
</if>

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

2. Пользовательские задачи Ant . Я сам виновен в написании многих из них. Есть много ситуаций, которые возникают в проектах, где мы создаем собственные задачи муравья. Это просто, если вы знаете, как написать одну, и чем для каждой сложной задачи, которую вам нужно выполнить, вы невольно начнете писать собственные задачи муравья.

Любой, кто пишет пользовательскую задачу муравья, будет:

а. Создайте новый класс, который расширяет класс Ant org.apache.tools.ant.Task.

б. Для каждого атрибута напишите метод установки.

с. Напишите метод execute (), который делает то, что вы хотите, чтобы эта задача делала.

В этом нет ничего плохого, но представьте, что каждый раз, когда вы хотите внести небольшое изменение, вам придется вносить изменения в исходный код Java, компилировать, тестировать и переупаковывать.

3. Сценарии . Вы можете расширить Ant, не написав пользовательских задач ant, а используя небольшие фрагменты кода, написанного на интерпретируемом языке, таком как JRuby, BeanShell или Groovy. Эти фрагменты кода могут быть помещены в ваши файлы сборки или в отдельные текстовые файлы. Если вы используете Ant-задачу Groovy, ваш файл сборки может выглядеть примерно так:

Листинг 3:

 <groovy classpathref="build.classpath">
import some.package
import another.package

def fullpath = "${.basedir}/${defaulttargetdir}"

def somefile = new SomeFile(projectName:"${pname}",
buildLabel:"${label}", buildTime:"${new Date()}")

def xml = "${fullpath}/dashboard.xml"

new File(path).write(somefile.generateReport())

ant.xslt(in:path,
out:"${properties.defaulttargetdir}/some.html",
style:"${properties.defaulttargetdir}/lib/report-style.xsl")
</groovy>

Представьте, что в ваших файлах сборки есть несколько строк XML, в которых есть множество небольших фрагментов скриптов. Я сам не люблю смешивать и сопоставлять файлы сборки с фрагментами кода. Если у вас есть команда, где все находятся на одной странице, все работает отлично. Что если член команды не имеет ни малейшего представления о каком-либо из языков сценариев? Он / она не будет знать, как внести незначительные изменения, когда дела идут плохо. Если у вас есть все вышеперечисленное или хотя бы один из вышеперечисленных случаев, вам нужно серьезно подумать об использовании Gant. Процитирую Аристотеля:

Что касается того, чему мы должны научиться, прежде чем мы сможем это сделать, мы учимся этим ».

Итак, давайте посмотрим, как легко выучить Ганта и посмотреть, как все может улучшиться.

Эта часть охватывает самые основы Ганта. В следующей части мы углубимся в Gant, используя его с примером проекта для создания приложения, и мы также увидим, как использовать его с нашим CI Server.


Что такое Гант?

Gant — это инструмент для сборки, который использует Groovy и Ant. С Gant вы описываете процесс сборки с помощью скриптов Groovy. Проще говоря, Gant позволяет вам определять логику сборки, используя Groovy вместо XML. Следующее, что вы можете спросить: «Является ли Гант конкурентом муравья?». Позвольте мне процитировать с сайта Gant, чтобы прояснить ситуацию здесь:

Хотя его можно рассматривать как конкурента Ant, Gant использует задачи Ant для многих действий, поэтому Gant действительно альтернативный способ выполнения сборок с использованием Ant, но с использованием языка программирования, а не XML, для определения правил сборки.
 

 Загрузите и установите Gant.

Чтобы Гант работал, у вас должен быть установлен Groovy . Вы можете скачать и следовать инструкциям по установке Groovy здесь .

Как я уже говорил ранее, чтобы использовать Gant , вы должны также знать Groovy . Если вы никогда ранее не писали код на Groovy, есть много интересных книг на Groovy, таких как:

1. Groovy в действии

2. Groovy Рецепты

3. Грооци Рефкардз

Вы также можете прочитать руководство по началу работы на веб-сайте Groovy , которое должно послужить хорошей отправной точкой.

Загрузите последнюю версию Gant отсюда . Гант в настоящее время на версии 1.4.0. Распакуйте его в папку. Если у вас уже есть GROOVY_HOME   , это все, что вам нужно, чтобы использовать Gant.

Начиная. Откройте консоль и введите gant . Вы должны увидеть сообщение, как показано ниже:

meera-subbaraos-macbook-9: ~ meerasubbarao $ gant
Не удается открыть файл build.gant
meera-subbaraos-macbook-9: ~ meerasubbarao $ 

На этом этапе вы все настроены на использование Gant в своих проектах.

Справочная информация: Откройте консоль и введите gant -h . Это обеспечит вас всей необходимой справочной информацией, как показано ниже:

meera-subbaraos-macbook-9: CodeMetricsProject meerasubbarao $ gant -h
использование: gant [опция] * [target] *
 -c, — usecache Следует ли кэшировать сгенерированный класс и
                              выполнять измененные проверки файла перед повторной компиляцией.
 -n, — всухую Не выполняйте никаких действий.
 -C, — cachedir <cache-file> Каталог, в который нужно кэшировать сгенерированные
                              классы.
 -D <имя> = <значение> Определить для <имя> значение <значение>.
                              Создает переменную с именем <name> для использования в сценариях и свойство с
                              именем <name> для задач Ant.
 -L, — lib <path> Добавить каталог для поиска jar-файлов и
                              классов.
 -P, — classpath <путь> Укажите путь для поиска jar-файлов и
                              классов.
 -T, — цели Распечатать список возможных целей.
 -V, — версия Распечатать номер версии и выйти.
 -d, — debug Печать уровней отладки информации.
 -f, — file <build-file> Использовать именованный файл сборки вместо файла по
                              умолчанию build.gant.
 -h, — помогите Распечатать это сообщение.
 -l, — gantlib <библиотека> Каталог, содержащий классы, которые будут использоваться
                              в качестве дополнительных модулей Gant
 -p, — projecthelp Распечатайте список возможных целей.
 -q, — quiet Не распечатывать много при выполнении.
 -с, — молчать ничего не распечатывать при выполнении.
 -v, — verbose Распечатать много дополнительной информации.

Создайте новый файл с именем build.gant в корне вашего проекта.

Вас поразило сходство между Муравьем и Гантом? Файлы сборки Ant обычно называются build.xml , и они также создаются в качестве обычной практики в корне папки вашего проекта.

Если вы написали или даже изменили файлы сборки Ant, вы будете знать, что он содержит один элемент проекта , который, в свою очередь, содержит имя , цель по умолчанию и базовый каталог .  

Листинг 4:

<project name="GantSamples" basedir="." default="compile">

Так, например, цель sayHello в Ant будет выглядеть примерно так:

<target name="sayHello" description="Saying Hello">
<echo message="Hello Javalobby"/>
</target>

Давайте создадим цель sayHello, а также посмотрим, как установить ее в качестве цели по умолчанию в Gant.

Цель Gant имеет имя и описание :

Листинг 5:

target ( target-name : target-description ) {
groovy code sequence
}

Вышеуказанная цель sayHello в Gant будет выглядеть так , как показано ниже:

target(sayHello:"Saying hello"){
Ant.echo(message:"Hello Javalobby")
}

Теперь откройте командное окно и введите gant в корне проекта, где существует файл build.gant . Вы должны быть в состоянии увидеть вывод, как:


meera-subbaraos-macbook-9: CodeMetricsProject meerasubbarao $ gant

Целевого значения по умолчанию не существует.

 

Гант жалуется, что мы не установили цель по умолчанию. Давайте посмотрим, как сделать то же самое:

Цель по умолчанию: В Ant вы определяете цель по умолчанию из элемента проекта, как показано в листинге 4. Целью по умолчанию является цель, вызываемая, если в командной строке не указана цель. Однако внутри Gant нет тега проекта . Есть два способа указать цель по умолчанию, как показано ниже:

1. Вы просто создаете цель, имя которой по умолчанию.

target ( 'default' , 'The default target.' ) { aTarget ( )

2. или даже просто:

setDefaultTarget ( aTarget )

Чтобы заставить нашу цель sayHello работать, нам нужно добавить один из приведенных выше скриптов в наш файл build.gant.

Листинг 6:

setDefaultTarget(sayHello)
or
target ("default": "The default target." ) {
sayHello ( )
}

Полный список build.gant:

target(sayHello:"Saying hello"){
Ant.echo(message:"Hello Javalobby")
}

/*
target ("default": "The default target." ) {
sayHello ( )
}
*/

setDefaultTarget(sayHello)

И вы должны увидеть:

meera-subbaraos-macbook-9: CodeMetricsProject meerasubbarao $ gant
     [echo] Здравствуйте, Javalobby
meera-subbaraos-macbook-9: CodeMetricsProject meerasubbarao $

Это было просто! Если у вас есть файлы сборки, и ваша команда не справляется с этим, есть инструмент, который может также преобразовывать ваши сценарии Ant в сценарии Gant. Я не использовал это, но вы можете попробовать это здесь .

В этой части серии мы узнали, когда переходить с Ant на Gant , скачали и установили Gant и, наконец, написали простой файл сборки gant. В следующей части этой серии мы увидим Gant in Action в простом Java-проекте.

И, как всегда, держите нас в курсе, если у вас возникнут проблемы с началом работы с Gant. Оставайтесь в курсе.