是否可以从包含的构建文件中覆盖nant目标?

时间:2009-07-21 12:26:24

标签: nant

我有一个通用的common.xml文件,它包含许多在多个版本中重复使用的通用nant目标。我想要做的是“覆盖”其中一些非目标,并在执行现有目标之前或之后包含其他步骤。

是否首先使用当前文件中的nant目标?即。如果我在当前构建文件中创建一个nant目标,其名称与包含文件中的目标同名,那么是否会调用该目标并忽略包含的目标?如果是这种情况,我可以这样做并调用包含的目标,但这似乎是一个递归调用,而不是一个包含的任务。

思想?

2 个答案:

答案 0 :(得分:3)

我有同样的问题(并发现相同的结果),但我也找到了解决方法。请允许我举例说明。

你有一个ProjectFile.build和一个CommonFile.build。假设您要覆盖名为“Clean”的目标。

您需要创建一个新文件(称为CommonFile_Clean.build),其中包含:

<?xml version="1.0"?>
<project>
  <target name="Clean">
        <echo message="Do clean stuff here" />
  </target>
</project>

在CommonFile.build中,您有条件地包含CommonFile_Clean.build:

<?xml version="1.0"?>
<project>
    <echo message="checking Clean definition..." />
    <if test="${not target::exists('Clean')}">
            <echo message="Clean target not defined." />
        <include buildfile="CommonFile_Clean.build" />      
    </if>
</project>

在ProjectFile.build中,您可以定义Clean目标(在这种情况下不会使用CommonFile_Clean.build),也可以使用CommonFile_Clean.build中定义的默认实现。

当然,如果您有大量目标,这将是相当多的工作。

希望有所帮助。

答案 1 :(得分:2)

不,我刚尝试过,因为我有类似的设置,因为我拥有了我们在commonFile.build中使用的所有构建目标,然后使用以下代码将其引入。 ..

<include buildfile="../commonFile.build"/>

在我的newFile.build(包括文件顶部的commonFile.build)中,我添加了一个名为“build”的新目标,因为它存在于commonFile中,这是你得到的错误消息。 ..

  

建立失败

     

名为'build'的重复目标!

好主意,可能是OO原则的讽刺,但遗憾的是它不起作用。

有什么好处吗?