我一直在寻找从顶级宏生成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类是一个任务容器,而不是一个任务。因此,它不能放入容器中。所以我想我会写一些可扩展的任务。
答案 0 :(得分:1)
ANT有几种构建模块化构建的机制。
首先,我认为您的主要问题是如何为您的构建构建“扩展点”?以下ANT任务旨在从另一个构建文件导入公共构建逻辑:
由于您已经计划使用macrodef扩展构建,我建议将它们打包为可重用的ANTlib。 ANTlib可以存在于您的项目中,但它实际上被设计为打包在另一个构建可以拾取的jar文件中,例如通过将其安装在标准的ANT lib目录中:
最后,如果您已经在使用ivy并将taskdef打包为ANT库,则可以通过将其安装在Maven存储库管理器(如Nexus)中来对构建逻辑进行版本控制。这解决了大型ANT构建的一个关键问题。随着时间的推移,它们变得如此之大,以至于不可能在不影响旧版本的情况下改变通用逻辑(证明构建版本没有相互隔离)。
答案 1 :(得分:0)
其实这样做了。 尽管存在一些警告,但它的工作是否有效。 对于那些感兴趣的人:https://bitbucket.org/targetsan/ant-events