使用宏生成Ant任务

时间:2012-10-30 21:04:06

标签: ant target macrodef

我一直在寻找从顶级宏生成ANT目标的可能性。

详细说明:

我们有异源构建系统。 ANT + IVY用作顶级(继承的solutin,不能更改)。有些项目是通过MSBuild构建的,从ANT通过exec任务调用。对于这些项目中的每一个,至少有两个不同的调用msbuild(为了简洁而用宏包装),一个在“build”目标中,一个在“clean”中。其中两个仅与“目标”参数不同。所以我猜测,如果有可能出现这样的事情:

扩展节点:

<extensionpoint name="build-ext-point" />
<extensionpoint name="clean-ext-point" />
<target name="build" depends="build-ext-point" />
<target name="clean" depends="clean-ext-point" />

我的神奇宏:

<macrodef name="msbuild-proj" />
    <attribute name="project" />
    <sequential>
        <target name="@{project}-build" >
            <msbuild project="@{project}" target="Build" />
        </target>
        <target name="@{project}-clean" >
            <msbuild project="@{project}" target="Clean" />
        </target>
    </sequential>
</macrodef>

如何使用:

<msbuild-proj project="CPP-proj" />

谢谢!

P.S:是的,我知道我可以定义那些构建和清理覆盖,或通过ext point,或其他任何东西。实际上问题是我是否可以删除一些代码重复。

UPD:我自己回答这个问题。在这一点上,没有这种可能性。主要是因为Target类是一个任务容器,而不是一个任务。因此,它不能放入容器中。所以我想我会写一些可扩展的任务。

2 个答案:

答案 0 :(得分:1)

ANT有几种构建模块化构建的机制。

首先,我认为您的主要问题是如何为您的构建构建“扩展点”?以下ANT任务旨在从另一个构建文件导入公共构建逻辑:

由于您已经计划使用macrodef扩展构建,我建议将它们打包为可重用的ANTlibANTlib可以存在于您的项目中,但它实际上被设计为打包在另一个构建可以拾取的jar文件中,例如通过将其安装在标准的ANT lib目录中:

  • $ ANT_HOME / lib中
  • $ HOME /赵军阳张志利/ lib中

最后,如果您已经在使用ivy并将taskdef打包为ANT库,则可以通过将其安装在Maven存储库管理器(如Nexus)中来对构建逻辑进行版本控制。这解决了大型ANT构建的一个关键问题。随着时间的推移,它们变得如此之大,以至于不可能在不影响旧版本的情况下改变通用逻辑(证明构建版本没有相互隔离)。

答案 1 :(得分:0)

其实这样做了。 尽管存在一些警告,但它的工作是否有效。 对于那些感兴趣的人:https://bitbucket.org/targetsan/ant-events