首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以动态调用宏任务?

是否可以动态调用宏任务?
EN

Stack Overflow用户
提问于 2011-07-18 19:19:29
回答 3查看 1.5K关注 0票数 4

我有一些宏the任务,我想要调用,但希望用一些时间戳代码包装调用。如果任务是目标而不是使用antcall宏,则可以很容易地完成这一任务。

是否有可能对宏进行同样的操作?

示例:

“宏调用”线是我想要使用的一种假设任务(类似于"antcall")。

代码语言:javascript
运行
复制
<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>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-27 15:23:15

为什么不用目标包装您的macro1 macro2,并为“宏调用”使用一个反调用。新的macro1、macro2目标将在各自的项目中运行(属性和ref传入,但不退出),这可能是一件好事,也可能不是一件好事,这取决于您想要完成什么。

据我所知,没有一种纯粹的蚂蚁来完成你想要的事情--动态地调用一个任务。您可能需要找到一些外部包,甚至接近,但它可能会更丑。

票数 0
EN

Stack Overflow用户

发布于 2014-05-07 21:55:30

这是一个很晚的答复,但我一直在为同样的问题挣扎了一段时间,刚才想出了一个解决办法,所以我想我会作出贡献。

首先,我认为可以肯定地说,除了将Ant代码回显新文件,然后从文件中调用宏new之外,不可能单独使用Ant来完成这一任务。

无论如何,我决定使用Groovy Ant任务运行一些Groovy代码。我想出的是:

代码语言:javascript
运行
复制
<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任务,但不幸的是,我还不太需要了解这些知识。

票数 0
EN

Stack Overflow用户

发布于 2015-12-24 15:59:49

动态解析宏名称有两种方法

1)宏名称在加载期间并不是常量的,并且取决于“什么-对-说”变量。因此,只有一个宏获得“say- there”名称,而另一个宏的名称未被解析(因此无法调用)

代码语言:javascript
运行
复制
<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定义的附加文件,例如

代码语言:javascript
运行
复制
<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>

并且只在你的主要项目中包括其中一个

代码语言:javascript
运行
复制
<property name="what-to-say" value="bye"/>

<import file="macrodefs-${what-to-say}.xml"/>

<target name="test">
    <say-something/>
</target>
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6738156

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档