【问题标题】:Generate Ant tasks with macro使用宏生成 Ant 任务
【发布时间】:2012-11-28 18:44:45
【问题描述】:

我一直在寻找从顶级宏生成 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" />

谢谢!

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

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

【问题讨论】:

    标签: ant target macrodef


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      【解决方案2】:

      确实做到了。 它的工作,虽然存在一些警告。 感兴趣的朋友:https://bitbucket.org/targetsan/ant-events

      【讨论】:

      猜你喜欢
      • 2013-10-05
      • 2012-09-13
      • 2011-06-02
      • 2011-08-13
      • 2017-11-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多