Как избежать запуска задач муравья на исходных файлах, которые не изменились? - PullRequest
3 голосов
/ 12 февраля 2012

У меня есть задача ant, которая выполняет некоторую команду в списке файлов. Я хотел бы при последовательных сборках избегать повторного запуска команды для файлов, которые успешно выполнили команду и не изменились.

Например: (здесь команда xmllint)

 <target name="xmllint-files">
    <apply executable="xmllint">
        <srcfile/>
        <fileset dir="." includes="*.xml">
            <modified/>
        </fileset>

    </apply>
</target>

Проблема заключается в том, что даже файлы, в которых произошел сбой xmlint, считаются измененными и поэтому xmllint не будет повторно запускаться на них при последовательных сборках. Очевидно, это не желаемое поведение.

Два замечания:

  1. Я ищу общее решение, а не только решение для xmllint.
  2. Я хочу полностью решить проблему внутри ant, не создавая внешние скрипты.

1 Ответ

3 голосов
/ 12 февраля 2012

Этот код использует задачу Groovy ANT для выполнения следующих действий:

  • Реализация пользовательского селектора groovy, выбирающего файлы XML для обработки на основе проверки контрольной суммы MD5.
  • Вызывать xmllint для каждого файла и сохранять контрольную сумму при успешном завершении (Это предотвращает повторное выполнение xmllint , если содержимое файла не изменяется.

Пример:

<project name="demo" default="xmllint">

    <!--
    ======================
    Groovy task dependency
    ======================
    -->
    <path id="build.path">
        <pathelement location="jars/groovy-all-1.8.6.jar"/>
    </path>
    <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpathref="build.path"/>

    <!--
    ==============================================
    Select files to be processed 
    MD5 checksums located in "checksums" directory
    ==============================================
    -->
    <target name="select-files">
        <fileset id="unprocessedfiles" dir=".">
            <include name="*.xml"/>
            <exclude name="build.xml"/>
            <scriptselector language="groovy" classpathref="build.path">
                def ant = new AntBuilder()
                ant.checksum(file:filename, toDir:"checksums", verifyProperty:"isMD5ok")

                self.selected = (ant.project.properties.isMD5ok == "false") ? true : false
            </scriptselector>
        </fileset>
    </target>

    <!--
    =============================================================
    Process each file 
    Checksum is saved upon command success, prevents reprocessing
    =============================================================
    -->
    <target name="xmllint" depends="select-files">
        <groovy>
            project.references.unprocessedfiles.each { file ->
                ant.exec(executable:"xmllint", resultproperty:"cmdExit") {
                    arg(value:file)
                }
                if (properties.cmdExit == "0") {
                    ant.checksum(file:file.toString(), toDir:"checksums")
                }
            }
        </groovy>
    </target>

</project>

Примечание :

  • Это сложное требование не может быть реализовано с использованием исходной задачи ANT apply Один вызов команды xmllint может быть успешным, а другой - неудачным.
  • Для хранения файлов контрольных сумм MD5 создается подкаталог с именем "контрольные суммы".
  • Groovy jar можетможно загрузить с Maven Central

Оригинальный ответ

Использовать модифицированный селектор ANT

<project name="demo" default="xmllint">

    <target name="xmllint">
        <apply executable="xmllint">
            <srcfile/>
            <fileset dir="." includes="*.xml">
                <modified/>
            </fileset>
        </apply>
    </target>

</project>

Файл свойств с именем «cache.properties» будет создан впостроить каталог.Он записывает дайджесты файлов и определяет, был ли файл изменен с момента последнего запуска сборки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...