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
сообщает список отсутствующих файлов только в том случае, если файл отсутствует.