我有几个构建文件,它们都导入相同的基本构建文件,如下所示:
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,这似乎不可避免。
我怎样才能消除这个错误?
根据sudocode的答案,我解决了这个问题。因为在这两种情况下base.xml的绝对路径是不同的,所以Ant不会将其识别为相同的文件。即使将inheritAll
设置为false
,调用任务的上下文仍然保留,这会导致名称冲突。
要解决这个问题,可以从base.xml中省略name
属性。从Ant 1.8开始,导入任务有一个属性as
,当基本项目没有名称时,可以使用它来引用基本目标。如果不覆盖任何目标,可以使用include代替import
。我的版本是1.7,所以这对我没有帮助。
对于以前版本的Ant,您可以通过执行调用来完全防止Ant上下文的扩散(然后您将得到两个正在运行的Ant实例)。更好的是,找到一种方法在两个文件中导入完全相同的base.xml(具有相同的绝对路径)。
您正在使用Ant 1.6吗?这个已解决的Ant错误看起来与此相同。
编辑
我试着复制你最近评论中提到的目录结构。
./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