Ant对象和引用:引用ID的范围是什么?

时间:2014-06-27 09:55:44

标签: ant

奇怪的是没有关于它的文档(至少没有我所知道的文档;我很乐意经过纠正)。

当我这样做时:

<fileset id="my.fs" dir="..."/>

ID my.fs的范围是什么?

  • 整个Ant执行周期?
  • 当前目标(以及当前目标上depends的任何目标)?

最后,如果多个线程(使用parallel任务生成)尝试定义具有相同ID的文件集会发生什么?

1 个答案:

答案 0 :(得分:5)

在定义它们的项目中可以看到引用。例如,如果<fileset id="my.fs" dir="..."/>放在任何目标之外,则它对于构建文件中的所有目标都是可见的。如果它在目标A中定义,那么如果B取决于B,它将在目标A中可见:

示例1:

<project name="Project1" default="doIt">

   <fileset id="my.fs" dir="some_dir"/>
   ...

   <target name="doIt">
       <copy todir="some_dir_copy">
           <fileset refid="my.fs" />  <!-- this will work -->
       </copy>
   </target>
</project>

示例2:

<project name="Project1" default="doIt">

   <target name="prepare">
       <fileset id="my.fs" dir="some_dir"/>
   </target>

   <target name="doIt" depends="prepare">
       <copy todir="some_dir_copy">
           <fileset refid="my.fs" />  <!-- this will work -->
       </copy>
   </target>
</project>

但是,如果您要调用子项目,例如使用antantcall任务时,子项目默认情况下继承父项目中定义的引用(与Ant属性不同)。要继承它们,可以在调用子项目时将inheritrefs属性设置为true:

示例3:

<project name="Project1" default="doIt">

   <target name="doIt">
       <fileset id="my.fs" dir="some_dir"/>
       <ant antfile="./build.xml" target="run" />
   </target>

   <target name="run">
       <copy todir="some_dir_copy">
           <fileset refid="my.fs" />  <!-- this will fail -->
       </copy>
   </target>
</project>

示例4:

<project name="Project1" default="doIt">

   <target name="doIt">
       <fileset id="my.fs" dir="some_dir"/>
       <ant antfile="./build.xml" target="run" inheritrefs="true" />
   </target>

   <target name="run">
       <copy todir="some_dir_copy">
           <fileset refid="my.fs" />  <!-- this will work -->
       </copy>
   </target>
</project>

如果您在parallel任务中执行了并行任务,并且两者都定义了相同的引用ID,那么根据执行顺序,最后一个完成将覆盖其他任务的引用。

<parallel>
    <fileset id="my.fs" dir="some_dir"/>
    <fileset id="my.fs" dir="another_dir"/>
</parallel>

...

<target name="doIt">
    <copy todir="some_dir_copy">
        <fileset refid="my.fs" />  <!-- this may copy either some_dir or another_dir, depending on which parallel task finished last -->
    </copy>
</target>