Запуск задачи 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 не знает о текущей сборке).

Спасибо за любую помощь.

Author: SDC, 2011-11-28

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
 3
Author: sudocode, 2017-05-23 12:00:50