Ant 蚂蚁:“;“导入”中重复的项目名称;使用导入的生成文件

Ant 蚂蚁:“;“导入”中重复的项目名称;使用导入的生成文件,ant,build,Ant,Build,我有几个构建文件,它们都导入相同的基本构建文件,如下所示: base.xml: <project name="base"> <!-- does not define a 'build' target --> </project> <project name="buildA"> <import file="base.xml" /> <target name="build"> <a

我有几个构建文件,它们都导入相同的基本构建文件,如下所示:

base.xml:

<project name="base">
    <!-- does not define a 'build' target -->
</project>
<project name="buildA">
    <import file="base.xml" />
    <target name="build">
        <ant antfile="buildB.xml" target="build"
            inheritall="false" inheritrefs="false" />
    </target>
</project>
<project name="buildB">
    <import file="base.xml" />
    <target name="build">
        ...snip...
    </target>
</project>

buildA.xml:

<project name="base">
    <!-- does not define a 'build' target -->
</project>
<project name="buildA">
    <import file="base.xml" />
    <target name="build">
        <ant antfile="buildB.xml" target="build"
            inheritall="false" inheritrefs="false" />
    </target>
</project>
<project name="buildB">
    <import file="base.xml" />
    <target name="build">
        ...snip...
    </target>
</project>

buildB.xml:

<project name="base">
    <!-- does not define a 'build' target -->
</project>
<project name="buildA">
    <import file="base.xml" />
    <target name="build">
        <ant antfile="buildB.xml" target="build"
            inheritall="false" inheritrefs="false" />
    </target>
</project>
<project name="buildB">
    <import file="base.xml" />
    <target name="build">
        ...snip...
    </target>
</project>
(模块A取决于模块B。)

现在,上面从buildA.xml调用B的
build
target会产生以下错误:

导入中存在重复的项目名称。首先在buildA.xml中定义项目库,然后再在buildB.xml中定义项目库

由于buildA.xml和buildB.xml都继承相同的base.xml,这似乎是不可避免的


如何消除此错误?

您使用的是Ant 1.6吗?这看起来是同一个问题

编辑

我试图复制您在最近的评论中提到的dir结构

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

根据sudocode的回答,我解决了这个问题。因为在这两种情况下base.xml的绝对路径不同,Ant无法将其识别为同一个文件。即使
inheritAll
设置为
false
,调用任务的上下文仍会保留,这会导致名称冲突

要解决这个问题,可以从base.xml中省略
name
属性。自Ant 1.8以来,任务有一个属性
,如
,当基本项目没有名字时,该属性可用于引用基本目标。如果不覆盖任何目标,可以使用而不是
import
。我是1.7,所以这对我没有帮助


对于Ant的早期版本,您可以通过一个调用来完全防止Ant上下文的扩散(然后您会得到两个正在运行的Ant实例)。更好的是,找到一种方法在两个文件中导入完全相同的base.xml(具有相同的绝对路径)。

无法使用ant 1.8.2复制。ant-f buildA.xml build
.Dang没有错误。似乎我把测试用例的例子简化了。对不起!为了复制,您必须在两个不同的目录中复制这三个文件,然后让buildA from dir1在dir2中调用buildB。我将相应地编辑我的问题。未编辑,但在下面发布了解决方案。谢谢sudocode,我对你的答案和评论投了赞成票。:-)不确定您的解决方案,但我已经在更新的答案中发布了我将如何做到这一点。我使用的是Ant 1.7.1,这是一个稍微不同的问题。但是,您的回答让我想到,我可能可以省略base.xml上的项目名称。我明天会试试,然后发布结果。是的,所有三个文件都必须复制,包括base.xml。我想我现在明白了。谢谢你在这件事上帮助我!不客气,但我不明白你说的“所有三个文件都必须复制”是什么意思。您不是在单个位置使用单个base.xml并在多个文件中引用它吗?如果是这样的话,我已经在上面展示过了。对,所有内容都有两个副本,包括base.xml。这与构建引导过程有关。它从CVS中获取头部,然后确定它应该使用的标记,检查构建过程的正确版本,并调用它。大多数情况下,两个副本都是相同的,但如果正在构建分支,则它们会有所不同。显然,对正确版本的构建脚本的调用不应该发生在Ant中。那我们就没事了。