可以动态调用macrodef任务吗?

时间:2011-07-18 19:19:30

标签: ant

我有许多我想调用的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>

3 个答案:

答案 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>