Предлагает ли Ant способ обойти зависимость?

В файле build.xml есть цель test и цель build. Цель test, очевидно, зависит от цели build.

Как я могу запустить только тестовую цель, временно пропустив компиляцию, не изменяя файл build.xml?

Я спрашиваю, потому что компиляция слишком длинная и обновляется сервером непрерывной интеграции; и я преследую проблему с модульными тестами.


person philant    schedule 17.12.2008    source источник


Ответы (5)


Нет, вы не можете пропустить его, не изменив файл сборки.

Вот что я делаю в своих проектах для решения этой проблемы. Для каждой общедоступной цели я создам частную цель с «делать-» перед ней. Частная цель не имеет зависимости, а публичная цель имеет цель «сделать-» в качестве зависимости.

Например:

<target name="compile" depends="init, do-compile" description="Compiles all of the source code" />

<target name="do-compile">
        <javac destdir="${classes.dir}" debug="true" encoding="ISO-8859-1">
            <src refid="src.path" />
            <include name="*.java" />
            <classpath refid="external.libraries.classpath" />
        </javac>
</target>
person John Sonmez    schedule 17.12.2008
comment
Похоже, мы работаем похожим образом - приятно знать, что я не одинок в этом вопросе :) - person Jon Skeet; 17.12.2008

Используйте атрибут unless.

<target name="test" unless="dont.run.tests">

Если вы не хотите запускать «тест», просто

муравей -Ddont.run.tests=true

Он должен быть неопределенным, если вы хотите, чтобы тесты выполнялись. Ant просто проверяет, определен ли он вообще. Кроме того, есть атрибут if, который делает обратное.

Вот статья об обоих.

person sblundy    schedule 17.12.2008
comment
Это правильный подход, должен быть отмечен как правильный ответ - person Bruno Saboia; 19.02.2015

Лично я обнаружил, что зависимости в Ant больше мешают, чем помогают. Обычно я устанавливаю два набора целей: те, которые на самом деле делают что-то (без зависимостей), и те, которые просто имеют зависимости. Таким образом, вы можете легко запустить одну цель, а также весь пакет и т. д. Это соответствует практическому (а не идеологическому) использованию, на мой взгляд.

person Jon Skeet    schedule 17.12.2008

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

Простой способ избежать выполнения цели — установить атрибут «если» цели на имя некоторого свойства. Если затем установить это свойство в командной строке при запуске Ant, эта цель будет пропущена.

person Dan Dyer    schedule 17.12.2008
comment
Согласен, но Ant просто используется для начальной компиляции большой кодовой базы на основе Makefile. - person philant; 17.12.2008

Просто временно «удалить» зависимость? Если код уже собран, все ваши файлы должны быть доступны, не так ли? - ой, только что увидел, что вы не можете изменить файл, хм, почему бы вам сначала не запустить то же самое задание локально?

person PPS    schedule 17.12.2008