0

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

细节:

我们有异构的构建系统。ANT+IVY 用作顶层(继承的solutin,不能更改)。一些项目是通过 MSBuild 构建的,通过 exec 任务从 ANT 调用。对于这些项目中的每一个,至少有两个不同的 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" />

谢谢!

PS:是的,我知道我可以定义那些构建和清理覆盖,或者通过 ext 点,或其他任何方式。问题实际上是我是否可以删除一些代码重复。

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

4

2 回答 2

1

ANT 有一些用于构建模块化构建的机制。

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

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

  • $ANT_HOME/lib
  • $HOME/.ant/lib

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

于 2012-11-02T12:47:38.147 回答
0

居然做到了这一点。它的工作,虽然存在一些警告。对于那些感兴趣的人:https ://bitbucket.org/targetsan/ant-events

于 2012-11-28T10:44:45.187 回答