我有几个构建文件,它们都导入相同的基本构建文件,如下所示:
base.xml:
<project name="base">
<!-- does not define a 'build' target -->
</project>
buildA.xml:
<project name="buildA">
<import file="base.xml" />
<target name="build">
<ant antfile="buildB.xml" target="build"
inheritall="false" inheritrefs="false" />
</target>
</project>
buildB.xml:
<project name="buildB">
<import file="base.xml" />
<target name="build">
...snip...
</target>
</project>
(模块A取决于模块B。)
现在,上面从 buildA.xml 调用B的build
目标会出现以下错误:
Duplicated project name in import. Project base defined first in buildA.xml and again in buildB.xml
由于 buildA.xml 和 buildB.xml 都继承了相同的 base.xml ,这似乎是不可避免的。
我怎么能摆脱这个错误?
答案 0 :(得分:2)
根据sudocode的回答,我解决了这个问题。由于 base.xml 的绝对路径在两种情况下都不同,因此Ant不会将其识别为同一文件。即使inheritAll
设置为false
,也会保留调用任务的上下文,这会导致名称冲突。
要解决此问题,可以省略 base.xml 中的name
属性。从Ant 1.8开始,import任务具有属性as
,当基础项目无名时,该属性可用于引用基础目标。如果您未覆盖任何目标,则可以使用include代替import
。我在1.7,所以这对我没有帮助。
对于以前版本的Ant,您可以通过exec调用来完全防止Ant上下文的扩散(然后您将获得两个正在运行的Ant实例)。更好的是,找到一种方法在两个文件中导入完全相同的 base.xml (具有相同的绝对路径)。
答案 1 :(得分:1)
您使用的是Ant 1.6吗?这个resolved Ant bug看起来像是同一个问题。
修改强>
我尝试重现你在最近评论中提到的目录结构。
./base.xml
./buildA
./buildA/buildA.xml
./buildB
./buildB/buildB.xml
并相应地修改了构建文件,例如
<project name="buildA">
<import file="../base.xml"/>
<target name="build">
<ant antfile="../buildB/buildB.xml" target="build" inheritall="false" inheritrefs="false"/>
</target>
</project>
对于使用ant 1.8.2或1.7.1的以下内容,我仍然没有出现构建错误:
ant -f buildA/buildA.xml build