Как выбрать подкаталоги в ant с помощью FileSet?
Я использую ant 1.6.2 и пытаюсь установить задачу, которая будет сравнивать исходный и целевой каталог, идентифицировать все подкаталоги, которые существуют в исходном каталоге, и удалять понравившиеся именованные подкаталоги в целевом каталоге.
Итак, скажем, в исходном каталоге есть подкаталоги sub1, sub2 и sub3, а в целевом каталоге есть sub1, sub2, sub3 и sub4, тогда я бы хотел удалить sub1, sub2 и sub3 из целевого каталога.
Я думал, что смогу сделать это, используя FileSelector, чтобы определить все каталоги в источнике, которые присутствуют в цели. Однако я не могу заставить селектор файлов
В конце концов, я решил сделать что-то вроде:
<fileset id="dirSelector" dir="${install.dir}">
<type type="dir"/>
<present targetdir="${dist.dir}"/>
</fileset>
Я начал с того, что просто попытался перечислить каталоги, присутствующие в исходном каталоге, и распечатать их:
<fileset id="dirSelector" dir="${install.dir}">
<type type="dir"/>
</fileset>
<property name="selected" refid="dirSelector" />
<echo>Selected: ${selected}</echo>
Тем не менее, я никогда не получаю ничего напечатанного с селектором типа установленным в каталог. Если я изменяю тип на файл, я получаю распечатанные файлы.
Есть ли лучший способ выполнить то, что я пытаюсь сделать? Я что-то упустил при использовании селектора типа?
1 ответ
Без написания пользовательской задачи Ant это будет немного грязно. Следующее должно помочь, если вы счастливы использовать библиотеку ant-contrib. Это что-то вроде хака (особенно то, как он использует свойства), но, похоже, работает нормально.
<project name="stackru" default="delete_target_dirs">
<taskdef resource="net/sf/antcontrib/antlib.xml">
<classpath>
<pathelement location="ant-contrib-1.0b3.jar"/>
</classpath>
</taskdef>
<property name="src.dir" value="src"/>
<property name="target.dir" value="target"/>
<target name="delete_target_dirs">
<for param="file">
<path>
<dirset dir="${src.dir}">
<include name="**"/>
</dirset>
</path>
<sequential>
<basename property="@{file}_basename" file="@{file}" />
<available property="@{file}_available" file="${@{file}_basename}" filepath="${target.dir}" />
<if>
<equals arg1="${@{file}_available}" arg2="true"/>
<then>
<delete verbose="true">
<dirset dir="${target.dir}" includes="${@{file}_basename}"/>
</delete>
</then>
</if>
</sequential>
</for>
</target>
</project>