使用<local>后引用全局Ant属性</local>

时间:2014-04-04 17:57:43

标签: ant

我可以在“块”范围内创建local property in Ant

但是我现在如何在同一个区块中引用全局属性?

<property name="myprop" value="global"/>
...
<sequential>
    <local name="myprop"/>
    <property name="myprop" value="local"/>
    <echo message="my local prop is ${myprop}"/> //<-- this works fine
    <echo message="my global prop is ????"/> //<-- HOW?
</sequential/>

请不要使用ant-contrib。 我也想把它保存在Ant中,而不是诉诸于JS。

我唯一能想到的是“复制”全局属性,使用不同的名称来在这个块中使用

    <local name="myglobprop"/>
    <property name"myglobprop" value="${myprop}"/>
    <local name="myprop"/>
    <property name="myprop" value="local"/>
    <echo message="my global prop is ${myglobprop}"/>

但这是不雅观的,似乎是多余的。我真的只是在寻找一个超出范围的属性引用方法。

编辑 - 用例

我试图强迫Ant做延迟扩展:

假设我有一个属性,其值是其他几个属性的组合。

<property name="mycmdline" value="${cmd}=${type}"/>

如果在上述属性之前知道${cmd}${type},那么一切都很好。但是在我的例子中,没有定义这些值(没有设置属性)。这些值仅在构建宏定义内的后期阶段才知道。

我有另一个简单的macrodef将执行延迟扩展:

<property name="mycmdline" value="${cmd}=${type}"/>
...
<macrodef name="property-expand">
    <attribute name="name"/>
    <attribute name="value"/>
    <sequential>
        <fail if="@{name}" message="Property @{name} is already set"/>
        <property name="@{name}" value="@{value}"/>
    </sequential>
</macrodef> 

最后,我的build macrodef将包含以下代码段:

<local name="cmd"/>
<local name="type"/>
<local name="mycmdline"/>
<property name="cmd" value="@{cmd}"/>
<property name="type" value="@{type}"/>
<property-expand name="mycmdline" value="${mycmdline}"/>

最后一行显然是错误的。我正在创建一个名为mycmdline的(现在是本地的)属性,其扩展值为global(现在超出范围)${mycmdline}。用于延迟扩展的macrodef本身很有用,但问题是全局${mycmdline}超出范围且无法引用。

我真正想要的是:

<property name="mycmdline" value="${cmd}=${type}"/>
...
<!-- In macrodef now -->
<local name="mycmdline"/>
<property-expand name="mycmdline" value="GLOBAL:${mycmdline}"/>

相反,我要做的是:

<property name="unexpanded_mycmdline" value="${cmd}=${type}"/>
...
<!-- In macrodef now -->
<local name="mycmdline"/>
<property-expand name="mycmdline" value="${unexpanded_mycmdline}"/>

为什么吗
它可能看起来不是很多,但它是关于可读性的。 unexpanded_mycmdlinemycmdline现在有两个不同的名称,当试图遵循通过脚本使用属性值的方式时,它现在会从一个属性名称跳转到另一个属性名称(无论多么相似)名字可能看起来)。整个unexpanded_前缀看起来不合适,并且不符合其他命名约定,除非我用一些前缀命名所有全局变量,这也没有意义。

0 个答案:

没有答案