Запуск задачи Ant exec только для измененных файлов
Я создаю сценарий сборки для большого PHP-приложения. Я использую сценарий Ant, которым управляет Дженкинс.
Я хочу включить в сценарий сборки такие инструменты, как PHP_CodeSniffer и PHPMD (детектор ошибок PHP), поэтому у меня есть такой код:
<target name="php-codesniffer">
<exec executable="phpcs" dir="${basedir}" output="${basedir}/build/logs/checkstyle.xml">
<arg line="--report=checkstyle --standard=PEAR ${basedir}/"/>
</exec>
</target>
<target name="phpmd">
<exec executable="phpmd" dir="${basedir}" output="${basedir}/build/logs/phpmd.xml">
<arg line="${basedir} xml codesize,unusedcode,naming"/>
</exec>
</target>
Однако для запуска обоих этих инструментов требуется слишком много времени, даже на небольших подмножествах нашей базы кода, поэтому я пытаюсь найти способы их использования, но без снижения производительности.
Моя текущая мысль такова запускать их только в файлах, которые были изменены в текущей сборке, но я недостаточно хорошо знаю Ant, чтобы заставить его сделать это.
Итак, вопрос в том, как я могу изменить вышеуказанные цели Ant таким образом, чтобы вызовы <exec>
выполнялись только для файлов, которые были изменены в текущей сборке? (или, альтернативно, в последние X минут, если Ant не знает о текущей сборке).
Спасибо за любую помощь.
1 answers
Взгляните на вопрос Как выполнять задачи ANT только для файлов, которые были изменены, и, в частности, этот ответ, который иллюстрирует использование измененного селектора.
Похоже, что phpcs принимает либо список файлов и/или каталогов. Он рекурсирует в каталоги.
Если вы собираетесь придерживаться указания одного каталога и рекурсии phpcs в него, то вы можете сначала найти целевые файлы (используя измененный селектор) и скопируйте во временный каталог. Затем укажите phpcs на этот каталог. Одним из недостатков этого является то, что вы добавляете дисковый ввод-вывод для копирования во время сборки.
Вероятно, лучше, вы могли бы указать путь к набору файлов, выбранному с помощью измененного селектора. Используйте для этого пробел в качестве pathsep
. Это даст вам свойство, значением которого является разделенный пробелом список ваших целевых файлов. Недостатком этого может быть то, что в итоге у вас будет слишком длинный список аргументы.
Чтобы ответить на ваш последующий вопрос в комментариях, вот простой пример того, как вы можете использовать pathconvert для создания списка файлов, разделенных пробелами, и передачи их исполняемому файлу (в данном случае команда Windows dir):
<project default="test">
<target name="test">
<pathconvert property="file.list" pathsep=" ">
<fileset dir="src">
<include name="a.txt"/>
<include name="b.txt"/>
</fileset>
</pathconvert>
<echo message="file.list: ${file.list}"/>
<exec executable="cmd">
<arg value="/c"/>
<arg value="dir"/>
<arg line="${file.list}"/>
</exec>
</target>
</project>
(Обратите внимание, что я использовал line
вместо value
для передачи списка файлов в exec
.)
Вот содержимое каталога, из которого выбираются файлы (один не включен):
C:\tmp\ant>dir src
Volume in drive C has no label.
Volume Serial Number is 1773-83D6
Directory of C:\tmp\ant\src
30/11/2011 12:21 <DIR> .
30/11/2011 12:21 <DIR> ..
30/11/2011 12:09 0 a.txt
30/11/2011 12:09 0 b.txt
30/11/2011 12:09 0 c.txt
3 File(s) 0 bytes
2 Dir(s) 435,642,912,768 bytes free
Вот результат:
C:\tmp\ant>ant
Buildfile: C:\tmp\ant\build.xml
test:
[echo] file.list: C:\tmp\ant\src\a.txt C:\tmp\ant\src\b.txt
[exec] Volume in drive C has no label.
[exec] Volume Serial Number is 1773-83D6
[exec]
[exec] Directory of C:\tmp\ant\src
[exec]
[exec] 30/11/2011 12:09 0 a.txt
[exec]
[exec] Directory of C:\tmp\ant\src
[exec]
[exec] 30/11/2011 12:09 0 b.txt
[exec] 2 File(s) 0 bytes
[exec] 0 Dir(s) 435,642,896,384 bytes free
BUILD SUCCESSFUL
Total time: 1 second