如何使用Ant的"同步"任务,但基于文件内容

Jon*_*ott 7 ant

我真的很喜欢Ant'同步'任务,但我需要做的是根据目标文件的内容是否与源文件的内容相匹配,将文件从源文件夹复制到目标文件夹,而不是检查文件修改日期(这是'同步'目前所做的事情).有没有办法实现这个目标?我注意到有一个用于文件内容的Ant比较器,以及一个可能派上用场的"校验和"任务.

谢谢!

Mil*_*son 5

对于遇到此问题且需要代码的任何其他人,此处是基于内容而不是时间戳同步一个位置与另一个位置的任务,它使用修改的选择器而不是另一个答案中的不同选择器来更好地控制文件差异的方式计算:

<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>
Run Code Online (Sandbox Code Playgroud)

请注意,这会使bar镜像foo(同步A-> B),如果你想要双向同步,你可以用B-> A中的副本替换删除,并提供一个concat任务来处理两个文件中对同一文件的更改位置.


Jon*_*ott 2

我能够使用 Ant 的“复制”任务来完成此任务,该任务具有带有different选择器的文件集(请参阅http://ant.apache.org/manual/Types/selectors.html# differentselect )。这是很强大的东西。