Как выбрать подкаталоги в ant с помощью FileSet? - PullRequest
5 голосов
/ 26 января 2010

Я использую 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 Ответ

4 голосов
/ 27 января 2010

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

<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>
...