Ant проверить существование набора файлов

В ant, как я могу проверить, существует или нет набор файлов (список путей, разделенных запятыми)?

Например, мне нужно проверить, существуют ли все пути, перечисленные в myprop, и если так, я хочу установить свойство pathExist:

<property name="myprop" value="path1,path2,path3"/>

Итак, в примере все path1 path2 path3 должны существовать, чтобы установить pathExist в true, в противном случае false.

Я обнаружил, что для одного ресурса я могу использовать задачу resourceexist, но я не могу понять, как использовать это с разделенным запятыми списком путей.

Как проверить существование набора путей? Спасибо!

Ответ 1

Вы можете использовать комбинацию filelist, restrict и condition для этого.

В приведенном ниже примере файл файл создается из свойства с разделенным запятыми списком файлов. Используя restrict, список файлов, которые не существуют, найден. Это помещается в свойство, которое будет пустым, если все файлы будут найдены.

<property name="myprop" value="path1,path2,path3"/>
<filelist id="my.files" dir="." files="${myprop}" />

<restrict id="missing.files">
  <filelist refid="my.files"/>
  <not>
    <exists/>
  </not>
</restrict>

<property name="missing.files" refid="missing.files" />
<condition property="pathExist" value="true" else="false">
    <length string="${missing.files}" length="0" />
</condition>
<echo message="Files all found: ${pathExist}" />

Вы можете использовать что-то вроде этого, чтобы создать сообщение об ошибке, в котором перечислены недостающие файлы:

<fail message="Missing files: ${missing.files}">
    <condition>
        <length string="${missing.files}" when="greater" length="0" />
    </condition>
</fail>

Ответ 2

Связанные условия - это кратчайшее решение для проверки наличия нескольких файлов или файлов:

<condition property="pathExist">
 <and>
  <available file="/foo/bar" type="dir"/>
  <available file="/foo/baz" type="dir"/>
  <available file="path/to/foobar.txt"/>
  ...
 </and>
</condition>

Чтобы проверить, существует ли в списке обработанный список путей, используйте Ant addon Flaka, f.e.

<project xmlns:fl="antlib:it.haefelinger.flaka">

 <!-- when you have a cvs property use split function
      to get your list to iterate over -->
 <property name="checkpath" value="/foo/bar,/foo/baz,/foo/bazz"/>
  <fl:for var="file" in="split('${checkpath}', ',')">
    <fl:fail message="#{file} does not exist !!" test="!file.tofile.exists"/>
  </fl:for>               
</project>

Другой возможностью является использование задачи scriptcondition с языком сценариев jvm, например groovy, beanshell и т.д.

Ответ 3

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

<property name="files" value="a.jar,b.jar,c.jar"/>

<target name="missing">
  <condition property="missing">
    <resourcecount when="ne" count="0">
      <difference id="missing">
        <intersect>
          <filelist id="required" dir="." files="${files}"/>
          <fileset id="existing" dir="." includes="*.jar"/>
        </intersect>
        <filelist refid="required"/>
      </difference>
    </resourcecount>
  </condition>
</target>

<target name="check" depends="missing" if="missing">
  <echo message="missing: ${toString:missing}"/>
</target>

Объект check сообщает список отсутствующих файлов только в том случае, если файл отсутствует.