Как использовать задачу Ant 'sync', но на основе содержимого файла - PullRequest
7 голосов
/ 09 мая 2011

Мне очень нравится задача Ant 'sync', но мне нужно скопировать файлы из исходной папки в папку назначения, основываясь на том, соответствует ли содержимое файла назначения содержимому исходного файла, вместо проверкидата изменения файла (что и делает в настоящее время синхронизация).Есть ли способ сделать это?Я заметил, что есть Ant-компаратор для содержимого файла, а также задача «контрольная сумма», которая может пригодиться.

Спасибо!

Ответы [ 3 ]

5 голосов
/ 28 июня 2013

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

<project name="Demo" default="newSync">
  <description>
    Sync from ${foo} to ${bar}
  </description>

  <macrodef name="syncContents">
    <attribute name="from"/>
    <attribute name="to"/>
    <sequential>
      <fileset id="selectCopyFiles" dir="@{from}">
        <modified algorithm="hashvalue"/>
      </fileset>
      <fileset id="selectDeleteFiles" dir="@{to}">
        <not>
          <present targetdir="@{from}"/>
        </not>
      </fileset>

      <copy overwrite="true" todir="@{to}">
        <fileset refid="selectCopyFiles"/>
      </copy>
      <delete includeEmptyDirs="true">
        <fileset refid="selectDeleteFiles"/>               
      </delete>
    </sequential>
  </macrodef>

  <target name="newSync">
    <syncContents from="${foo}" to="${bar}"/>
  </target>
</project>

Обратите внимание, что это делает зеркальное отображение foo (синхронизация A-> B), если вы хотите двунаправленную синхронизацию, вы можете заменить удаление копией из B-> A и предоставить задачу concat для работы с изменениями того же самого файл в обоих местах.

2 голосов
/ 21 мая 2011

Мне удалось выполнить это, используя задачу Ant 'copy', в которой был набор файлов с селектором different (см. http://ant.apache.org/manual/Types/selectors.html#differentselect). Это мощный инструмент.

1 голос
/ 27 октября 2014

Спасибо за эту задачу!

Однако набор файлов selectCopyFiles был неверным.У меня также есть другое решение для набора файлов selectDeleteFiles.

Вот новый код макроопределения:

<macrodef name="syncContents">
    <attribute name="from"/>
    <attribute name="to"/>
    <sequential>
        <echo>syncContents     : @{from} -> @{to}</echo>
        <fileset id="selectCopyFiles" dir="@{from}">
            <different targetdir="@{to}"
             ignoreFileTimes="true"/>
        </fileset>
        <fileset id="selectDeleteFiles" dir="@{to}">
            <present present="srconly" targetdir="@{from}"/>
        </fileset>

        <copy overwrite="true" todir="@{to}" preservelastmodified="true" verbose="true">
            <fileset refid="selectCopyFiles"/>
        </copy>
        <delete includeEmptyDirs="true" verbose="true">
            <fileset refid="selectDeleteFiles"/>
        </delete>
        <echo>End syncContents : @{from} -> @{to}</echo>
    </sequential>
</macrodef>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...