Ant 是否可以动态调用macrodef任务

Ant 是否可以动态调用macrodef任务,ant,Ant,我有很多macrodef任务要调用,但是我想用一些时间戳代码来包装这些调用。如果任务是目标而不是使用antcall的MacroDef,那么这很容易做到 是否可以对macrodef执行相同的操作 示例: “macrocall”行是我想使用的假设任务类型(类似于“antcall”) 为什么不将您的macro1 macro2包装成目标,并使用antcall作为“macrocall”。新的macro1、macro2目标将在各自的项目中运行(属性和ref传入,但不返回),这可能是一件好事,也可能不是一件好

我有很多macrodef任务要调用,但是我想用一些时间戳代码来包装这些调用。如果任务是目标而不是使用antcall的MacroDef,那么这很容易做到

是否可以对macrodef执行相同的操作

示例:
“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>