5

私は ant 1.6.2 を使用しており、ソース ディレクトリとターゲット ディレクトリを比較し、ソース ディレクトリに存在するすべてのサブディレクトリを特定し、ターゲット ディレクトリ内の好きな名前のサブディレクトリを削除するタスクを設定しようとしています。

したがって、ソース ディレクトリにサブディレクトリ sub1、sub2、および sub3 があり、ターゲット ディレクトリに sub1、sub2、sub3、および sub4 があるとします。ターゲット ディレクトリから sub1、sub2、および sub3 を削除します。

FileSelector を使用して、ターゲットに存在するソース内のすべてのディレクトリを識別することで、これを行うことができると思いました。ただし、 <type> ファイルセレクターがディレクトリの一致を返すことはできません。

最終的に、私は次のようなことをしたいと考えました:

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

ただし、タイプセレクターがディレクトリに設定されていると何も印刷されません。タイプをファイルに変更すると、ファイルが印刷されます。

私がやろうとしていることを達成するためのより良い方法はありますか? タイプセレクターの使用に何か欠けていますか?

4

1 に答える 1

4

カスタム 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>
于 2010-01-27T07:43:31.837 に答える