我可以在“块”范围内创建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_mycmdline
和mycmdline
现在有两个不同的名称,当试图遵循通过脚本使用属性值的方式时,它现在会从一个属性名称跳转到另一个属性名称(无论多么相似)名字可能看起来)。整个unexpanded_
前缀看起来不合适,并且不符合其他命名约定,除非我用一些前缀命名所有全局变量,这也没有意义。