ANT Build:可以从属性文件中的其他值解析令牌本身吗?

时间:2015-01-06 12:14:27

标签: ant replace build token

可以从属性文件中的其他值解析令牌本身吗?

是否可以评估令牌密钥,而无需对令牌进行硬编码?令牌本身可以从属性文件中的其他值解析吗?

例如,如果属性文件具有以下标记( test.properties ):

module_no       =   01
module_code     =   bb

title_01_aa =   ABC
title_02_aa =   DEF
title_03_aa =   GHI
title_01_bb =   JKL
title_02_bb =   MNO
title_03_bb =   PQR

build.xml的内容

<?xml version="1.0" encoding="utf-8"?>
<project default="repl">
    <property file="test.properties" />
    <target name="repl">
        <replace file="test.txt" token="module_title" value="title_${module_no}_${module_code}" />
    </target>
</project>

包含文字的示例内容:

Welcome to module_title.

替换任务将导致:

Welcome to title_01_bb.

如何实现这一目标?

Welcome to JKL.

这可能是非常基本的,但请指导我正确的方向。谢谢。

1 个答案:

答案 0 :(得分:0)

默认情况下,嵌套属性扩展在Ant中不起作用,如documentation

中所述
  

大括号嵌套

     

在默认配置中,Ant不会尝试平衡属性扩展中的大括号,它只会在创建属性名时使用文本到第一个右大括号。即在扩展诸如${a${b}}之类的内容时,它将被翻译成两部分:

     
      
  1. 扩展属性a${b - 可能没什么用处。
  2.   
  3. 第二个右大括号产生的文字}
  4.         

    这意味着您无法轻松扩展名称由属性提供的属性,但对于旧版本的Ant,some workarounds属性。使用Ant 1.8.0和the props Antlib,如果需要这样的功能,可以将Ant配置为使用在那里定义的NestedPropertyExpander。

如果检查变通方法链接,一种解决方案是使用macrodef复制属性:

<property file="test.properties" />
<target name="repl">
    <gettitleprop name="titleprop" moduleno="${module_no}" modulecode="${module_code}" />
    <replace file="test.txt" token="module_title" value="${titleprop}" />
</target>

<macrodef name="gettitleprop">
    <attribute name="name"/>
    <attribute name="moduleno"/>
    <attribute name="modulecode"/>
    <sequential>
        <property name="@{name}" value="${title_@{moduleno}_@{modulecode}}"/>
    </sequential>
</macrodef>