Получение NAnt для проверки измененных файлов в SVN - PullRequest
0 голосов
/ 08 октября 2009

В целях ускорения процесса непрерывной сборки NAnt / CruiseControl.Net / Ivy я надеялся, что NAnt будет проверять, изменилась ли моя кодовая база на локальном ПК после выполнения обновления на основе NAnt, а затем если код изменил , то начните процесс, чтобы пересобрать этот проект, и, возможно, поднять флаг для сборки всех последующих компонентов, независимо от их статуса изменения.

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

Мы исследовали удаление некоторых проектов из порядка сборки, но все они необходимы в случае каких-либо изменений в порядке дерева построения.

1 Ответ

7 голосов
/ 13 октября 2009

Пара вариантов, которые я вижу

1 - выдать svn-статус --show-updates перед включением svn и выяснить, есть ли какие-либо изменения (должно быть так же просто, как подсчет строк в ответе)- Я думаю, что современная папка будет генерировать только 1 строку)

2 - перейти от задачи svn-update к exec task и перенаправить вывод из svn в тестовый файл, который вы можете опубликовать, чтобы определить,любые обновления были сделаны (аналогично первому варианту).

3 - Захватите svn log после svn с задачей на основе http://jonathanmalek.com/wp/?p=244, а затем обработайте xml, чтобы определить, были ли внесены какие-либо изменения.,Это будет работать только в том случае, если вам гарантировано увеличение числа оборотов только на 1, поскольку он получает только информацию журнала для последней ревизии.Разница в этом заключается в том, чтобы получить журнал до svn up и после, а затем сравнить их.

Лично я бы выбрал вариант 2. Запуск svn up в обновленном рабочем каталоге приводит к одной строке (при ревизии) поэтому перейдите от использования задачи обновления svn к следующему:

<target name="Svn-update">
  <!-- Default to true so failure mode is to build / signal build is required -->
  <property name="source.changed" value="true"/> 
    <exec 
          program="svn.exe" 
         commandline=’up′ 
          output="_update.log" 
          failonerror="true"/> 
    <property name="updates.count" value="0"/>
    <foreach item="Line" in="_update.log" property="updates.line" trim="Both">
        <property name="updates.count" value="${int::parse(updates.count) + 1}"/>
    </foreach>
    <if test="${updates.count==1}">
        <!-- An up to date working directory generates a single line "At revision xxx" -->
        <property name="source.changed" value="false"/>
    </if>
</target>

теперь вы можете использовать if = "$ {source.change == 'true'}" и если = = "$ {source.changed== 'true'} ", чтобы определить, когда вы должны и должны выполнить оставшуюся часть вашей сборки и уведомления

...