Как я выбираю подкаталоги у муравья с помощью FileSet?

Я использую муравья 1.6.2 и пытаюсь настроить задачу, которая сравнит источник и целевой каталог, определить все подкаталоги, которые существуют в исходном каталоге и удаляют любившие названные подкаталоги в целевом каталоге.

Так, скажите, что исходный каталог имеет подкаталоги sub1, sub2, и sub3 в нем и целевой каталог имеют sub1, sub2, sub3, и sub4 в нем затем, я хотел бы удалить sub1, sub2, и sub3 от целевого dir.

Я думал, что мог сделать это при помощи 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>

Однако я никогда не получаю ничего распечатанного с набором селектора типа к каталогу. Если я изменяю тип для регистрации, я действительно распечатывал файлы.

Существует ли лучший способ выполнить то, что я пытаюсь сделать? Я пропускаю что-то в своем использовании селектора типа?

5
задан Eric Rosenberg 26 January 2010 в 20:43
поделиться

1 ответ

Не написание пользовательского муравей Задача, это будет немного грязным. Следующее следует сделать трюк, если вы рады использовать Ant-Promption библиотеку. Это немного взлома (особенно то, как он использует свойства), но кажется, работает хорошо.

<project name="stackoverflow" 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>
4
ответ дан 15 December 2019 в 01:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: