Запуск задачи Ant exec только для измененных файлов - PullRequest
2 голосов
/ 28 ноября 2011

Я создаю скрипт сборки для большого PHP-приложения.Я использую скрипт Ant, который запускает Jenkins.

Я хочу включить такие инструменты, как PHP_CodeSniffer и PHPMD (PHP Mess Detector) в скрипт сборки, поэтому у меня есть такой код:

<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 Ответ

3 голосов
/ 28 ноября 2011

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

Похоже, phpcs занимает либо список файлов и / или каталогов.Он возвращается в каталоги.

Если вы намерены придерживаться указания одного каталога и в нем есть рекурсивный набор phpcs, то вы можете сначала найти целевые файлы (используя измененный селектор) и скопировать во временный каталог.Затем укажите phpcs на этот каталог.Недостатком этого является то, что вы добавляете дисковый ввод-вывод для копии во время сборки.

Возможно, лучше, вы могли бы pathcovert набор файлов, выбранный с использованием модифицированного селектора.Для этого используйте пробел как pathsep.Это даст вам свойство, значением которого является список целевых файлов, разделенных пробелами.Недостатком этого может быть то, что вы получите слишком длинный список аргументов.


Чтобы ответить на ваш следующий вопрос в комментариях, вот простой пример того, как вы можете использовать pathconvert для созданияразделенный пробелами список файлов и передача их в исполняемый файл (в данном случае команда dir для Windows):

<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
...