2012-05-25 33 views
1

我有一个Android应用程序需要针对不同的环境(例如,UAT,舞台演出,制作等)构建。每个环境需要不同的属性(例如,URL,包等)。Ant中属性文件的变量

我想将所有不同的参数放到一个单独的属性文件中,并在每个参数前加上它匹配的环境。

例如,属性文件将包含开发环境的dev.home-url = http://home_dev.com和生产环境的prod.home-url = http://home.com

我用下面创建一个指向性的属性与params前缀文件:

<property file="parameters.properties" prefix="params" /> 

,并使用一个属性,我用:

${params.home-url} 

问题来了当我需要将环境的前缀添加到参数。 它最终会这样看,这显然无法做到:

${params.${env-prefix}.home-url} 

回答

6

一个经常被问到的问题有关Ant是:

How can I do something like <property name="prop" value="${${anotherprop}}"/> (double expanding the property)?

下面的Ant构建文件被启发常问问题。

parameters.properties

dev.home-url = http://home_dev.com 
prod.home-url = http://home.com 

的build.xml

<project default="example"> 
    <property name="env-prefix" value="dev" /> 
    <property file="parameters.properties" prefix="params" /> 

    <macrodef name="propertycopy"> 
     <attribute name="name" /> 
     <attribute name="from" /> 
     <sequential> 
      <property name="@{name}" value="${@{from}}" /> 
     </sequential> 
    </macrodef> 

    <target name="example"> 
     <propertycopy name="local.property" from="params.${env-prefix}.home-url" /> 
     <echo>${local.property}</echo> 
    </target> 
</project> 

执行的example任务输出:

Buildfile: /workspace/build.xml 
example: 
    [echo] http://home_dev.com 
BUILD SUCCESSFUL 
Total time: 405 milliseconds 
+0

从外部读取属性文件时的回波刚打印$ {params。$ {env-prefix} .home-url}而不是文件中该属性的值。 – Stimsoni

+0

我也尝试了它也从外部属性文件,它的工作。我更新了我的答案,以反映我所做的。如果属性文件中不存在,我会得到'$ {params.dev.home-url}'。你使用的是什么版本的Ant(' $ {ant.version}')?我正在使用1.8.2。 – creemama

+0

啊,我得到了你看到的行为,如果没有定义'env-prefix'。如果您尝试从命令行执行Ant构建文件,请执行'ant -Denv-prefix = dev'。 – creemama