Ant 是否可以动态调用macrodef任务
我有很多macrodef任务要调用,但是我想用一些时间戳代码来包装这些调用。如果任务是目标而不是使用antcall的MacroDef,那么这很容易做到 是否可以对macrodef执行相同的操作 示例:Ant 是否可以动态调用macrodef任务,ant,Ant,我有很多macrodef任务要调用,但是我想用一些时间戳代码来包装这些调用。如果任务是目标而不是使用antcall的MacroDef,那么这很容易做到 是否可以对macrodef执行相同的操作 示例: “macrocall”行是我想使用的假设任务类型(类似于“antcall”) 为什么不将您的macro1 macro2包装成目标,并使用antcall作为“macrocall”。新的macro1、macro2目标将在各自的项目中运行(属性和ref传入,但不返回),这可能是一件好事,也可能不是一件好
“macrocall”行是我想使用的假设任务类型(类似于“antcall”)
为什么不将您的macro1 macro2包装成目标,并使用antcall作为“macrocall”。新的macro1、macro2目标将在各自的项目中运行(属性和ref传入,但不返回),这可能是一件好事,也可能不是一件好事,这取决于您试图实现的目标
据我所知,没有纯粹的ant方法来完成您想要的任务——动态调用任务。您可能需要找到一些外部软件包才能接近,但可能会更难看。这是一个非常晚的答复,但我已经为完全相同的问题挣扎了一段时间,刚刚想出了一个解决方案,所以我想我会有所贡献 首先,我认为可以肯定地说,仅仅使用Ant是没有办法做到这一点的,除了做一些非常黑客的事情,比如将Ant代码回送到一个新文件,然后从该文件调用macrodef 无论如何,我决定使用运行一些Groovy代码。以下是我的想法:
<groovy>
ant."${properties["macrodef.name"]}"("dir":properties["dir"])
</groovy>
ant.${properties[“macrodef.name”]}(“dir”:properties[“dir”])
说明:
-ant.
只是告诉Groovy运行ant任务的前缀。例如,ant.echo()
运行
任务
-“${properties[“macrodef.name”]}”
从我的Ant项目中提取名为“macrodef.name”的属性
-将以上两种方式结合在一起,我告诉Groovy使用与属性“macrodef.name”的值相同的名称运行Ant任务。例如,如果我的Ant项目中的${macrodef.name}
当前持有“compile”的值,Groovy将把这一行读为Ant.compile
-(“dir”:properties[“dir”])
告诉Groovy使用Ant属性(也称为“dir”)的值运行带有属性“dir”的宏定义。很清楚,这是因为我的macrodef需要这个属性。在Ant中,它看起来是这样的:
我希望这能帮助任何遇到它的人!作为记录,我希望避免使用更通用的
任务,因为它显然比基本Ant或Groovy任务运行得慢。理想的解决方案可能是实际编写一个定制的Ant任务,但不幸的是,我还没有足够的知识来完成这项工作 动态解析宏定义名称有两种方法
1) Macrodef名称不是常量,在加载期间根据“说什么”变量进行解析。因此,只有一个macrodef获得“说点什么”名称,而另一个的名称没有解析(因此无法调用)
你好
再见!
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>
<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>