奇怪的是没有关于它的文档(至少没有我所知道的文档;我很乐意经过纠正)。
当我这样做时:
<fileset id="my.fs" dir="..."/>
ID my.fs
的范围是什么?
depends
的任何目标)?最后,如果多个线程(使用parallel
任务生成)尝试定义具有相同ID的文件集会发生什么?
答案 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>
但是,如果您要调用子项目,例如使用ant
或antcall
任务时,子项目默认情况下不继承父项目中定义的引用(与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>