我有一些宏the任务,我想要调用,但希望用一些时间戳代码包装调用。如果任务是目标而不是使用antcall宏,则可以很容易地完成这一任务。
是否有可能对宏进行同样的操作?
示例:
“宏调用”线是我想要使用的一种假设任务(类似于"antcall")。
<target name="run.tests">
<run.named.test name="macro1" />
<run.named.test name="macro2" />
</target>
<macrodef name="run.named.test">
<attribute name="name" />
<sequential>
<echoTime />
<macrocall name="@{name}" />
<echoTime />
</sequential>
</macrodef>
<macrodef name="macro1">
</macrodef>
<macrodef name="macro2">
</macrodef>发布于 2012-02-27 15:23:15
为什么不用目标包装您的macro1 macro2,并为“宏调用”使用一个反调用。新的macro1、macro2目标将在各自的项目中运行(属性和ref传入,但不退出),这可能是一件好事,也可能不是一件好事,这取决于您想要完成什么。
据我所知,没有一种纯粹的蚂蚁来完成你想要的事情--动态地调用一个任务。您可能需要找到一些外部包,甚至接近,但它可能会更丑。
发布于 2014-05-07 21:55:30
这是一个很晚的答复,但我一直在为同样的问题挣扎了一段时间,刚才想出了一个解决办法,所以我想我会作出贡献。
首先,我认为可以肯定地说,除了将Ant代码回显新文件,然后从文件中调用宏new之外,不可能单独使用Ant来完成这一任务。
无论如何,我决定使用Groovy Ant任务运行一些Groovy代码。我想出的是:
<groovy>
ant."${properties["macrodef.name"]}"("dir":properties["dir"])
</groovy>解释:
-ant.只是告诉Groovy运行Ant任务的前缀。例如,ant.echo()运行<echo>任务。
-"${properties["macrodef.name"]}"从我的Ant项目中提取名为"macrodef.name“的属性。
上面的两个-With像这样组合在一起,我告诉Groovy运行一个与属性"macrodef.name“的值同名的Ant任务。例如,如果我的Ant项目中的${macrodef.name}当前持有“ant.compile”的值,那么Groovy将把这一行读入ant.compile。
-("dir":properties["dir"])告诉Groovy使用也称为"dir“的Ant属性值来运行带有属性"dir”的宏。要明确的是,这是因为我的宏this需要这个属性。在Ant中,它应该如下所示:<compile dir="${dir}" />
我希望这对任何遇到它的人都有帮助!为了记录在案,我想避免使用更通用的<script>任务,因为显然它的运行速度明显慢于基本Ant或Groovy任务。理想的解决方案可能是实际编写自定义Ant任务,但不幸的是,我还不太需要了解这些知识。
发布于 2015-12-24 15:59:49
动态解析宏名称有两种方法
1)宏名称在加载期间并不是常量的,并且取决于“什么-对-说”变量。因此,只有一个宏获得“say- there”名称,而另一个宏的名称未被解析(因此无法调用)
<property name="what-to-say" value="bye"/>
<property name="say-${what-to-say}" value="say-something"/>
<macrodef name="${say-hi}">
<sequential>
<echo>hi!</echo>
</sequential>
</macrodef>
<macrodef name="${say-bye}">
<sequential>
<echo>bye!</echo>
</sequential>
</macrodef>
<target name="test">
<say-something/>
</target>2)创建两个具有宏two定义的附加文件,例如
<project name="macrodefs-hi.xml>
<macrodef name="say-something">
<sequential>
<echo>hi!</echo>
</sequential>
</macrodef>
</project>
<project name="macrodefs-bye.xml>
<macrodef name="say-something">
<sequential>
<echo>bye!</echo>
</sequential>
</macrodef>
</project>并且只在你的主要项目中包括其中一个
<property name="what-to-say" value="bye"/>
<import file="macrodefs-${what-to-say}.xml"/>
<target name="test">
<say-something/>
</target>https://stackoverflow.com/questions/6738156
复制相似问题