我有许多我想调用的macrodef任务,但是想用一些时间戳代码来包装调用。如果使用antcall将任务作为目标而不是macrodef,则可以轻松完成此操作。
是否可以使用macrodef执行相同的操作?
例:
“macrocall”行是我想要使用的假设任务(类似于“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>
答案 0 :(得分:0)
为什么不用目标包装macro1 macro2并使用antcall作为“macrocall”。新的macro1,macro2目标将分别在他们自己的项目中运行(属性和ref传入,但不会退出),这可能是也可能不是一件好事,这取决于你想要完成的事情。
据我所知,没有纯粹的蚂蚁方法来实现你想要的东西 - 动态地调用任务。你可能需要找到一些外包才能接近,但它可能会更加丑陋。
答案 1 :(得分:0)
这是一个非常晚的回复,但我一直在努力解决同样的问题一段时间,现在我想出了一个解决方案,所以我想我会做出贡献。
首先,我认为明确地说,单独使用Ant无法做到这一点是安全的,除了做一些非常hacky之类的事情,比如将Ant代码回显到新文件然后从文件中调用macrodef。
无论如何,我决定使用Groovy Ant task来运行一些Groovy代码。这就是我想出的:
<groovy>
ant."${properties["macrodef.name"]}"("dir":properties["dir"])
</groovy>
说明:
- ant.
只是告诉Groovy运行Ant任务的前缀。例如,ant.echo()
运行<echo>
任务。
- "${properties["macrodef.name"]}"
从我的Ant项目中提取名为“macrodef.name”的属性。
- 将上面的两个组合在一起就像这样,我告诉Groovy运行一个与属性“macrodef.name”的值相同的Ant任务。例如,如果我的Ant项目中的${macrodef.name}
当前包含“compile”的值,则Groovy会将此行读为ant.compile
。
- ("dir":properties["dir"])
告诉Groovy使用属性“dir”运行macrodef,使用名为“dir”的Ant属性的值。要清楚,这是因为我的macrodef需要这个属性。在Ant中,它看起来像这样:<compile dir="${dir}" />
我希望这可以帮助遇到它的人!为了记录,我想避免使用更通用的<script>
任务,因为它显然比基本的Ant或Groovy任务运行得慢得多。理想的解决方案可能是实际编写一个自定义Ant任务,但不幸的是,我还不太了解这一点。
答案 2 :(得分:0)
有两种方法可以动态解析macrodef名称
1)Macrodef名称不是常数并且在加载时间内解决,具体取决于&#34;说什么&#34;变量。结果,只有一个macrodef得到&#34;说 - 某事&#34;名称,其他人的名字未解决(因此无法调用)
<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)使用macrodef定义创建两个附加文件,例如
<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>