对于Ant脚本,我有以下myBuild.properties
文件
p.buildpath=c:productionbuild
d.buildpath=c:developmentbuild
我写了以下build.xml
:
<?xml version="1.0"?>
<project name="Test Project" default="info">
<property file="myBuild.properties"/>
<target name="info">
<input
message="Please enter the Server Name(p: production, d: development)?"
validargs="p,d"
addproperty="do.Server"
/>
<echo>Your Server type: ${do.Server} </echo>
<property name="myserv.buildpath" value="${do.Server}.buildpath" />
<property name="newProperty" value="${myserv.buildpath}" />
<echo>New Property Value: ${newProperty}</echo>
<!-- Following is an incorrect syntax -->
<echo>Build Path: ${${newProperty}}</echo>
</target>
</project>
当我使用运行它时
c: 蚂蚁
我得到以下输出:
构建文件:C:\build.xml
信息:[input]请输入服务器名称(p:production,d:development)?(p,d)
p
[echo]您的服务器类型:p
[echo]新属性值:p.buildpath
[echo]构建路径:${${newProperty}}成功构建
总时间:2秒
我想回显与p.buildpath
值相同的"构建路径"值。在上面的情况下怎么可能呢?
根据Ant Faq的macrodef建议,您不需要像antcontrib这样的Ant插件,这是万无一失的:
<project>
<macrodef name="cp_property">
<attribute name="name"/>
<attribute name="from"/>
<sequential>
<property name="@{name}" value="${@{from}}"/>
</sequential>
</macrodef>
<property file="myBuild.properties"/>
<input
message="Please enter the Server Name(p: production, d: development)?"
validargs="p,d"
addproperty="do.Server"
/>
<echo>Your Server type: ${do.Server}</echo>
<cp_property name="myserv.buildpath" from="${do.Server}.buildpath"/>
<echo>$${myserv.buildpath} : ${myserv.buildpath}</echo>
</project>
输出:
[input] Please enter the Server Name(p: production, d: development)? (p, d)
p
[echo] Your Server type: p
[echo] ${myserv.buildpath} : c:/production/build
顺便说一句。在您的属性文件中,您需要将路径分隔符更改为unix style '/'
(当打开windows时,蚂蚁会正确处理)或double '\'
,否则使用:
p.buildpath=c:productionbuild
d.buildpath=c:developmentbuild
你会得到这样的东西:
[input] Please enter the Server Name(p: production, d: development)? (p, d)
p
[echo] Your Server type: p
[echo] ${myserv.buildpath} : c:productionbuild
另请参阅https://stackoverflow.com/a/25681686/130683对于用Props antlib 解决的一个非常相似的问题
您可以通过这种方式(编辑/修订版)在不使用其他工具的情况下执行:
<project name="Test Project" default="info">
<property file="myBuild.properties"/>
<target name="info">
<input
message="Please enter the Server Name(p: production, d: development)?"
validargs="p,d"
addproperty="do.Server"
/>
<echo>Your Server type: ${do.Server} </echo>
<property name="buildstage.production" value="p.buildpath" />
<property name="myserv.buildpath" value="${do.Server}.buildpath" />
<echo>New Property Value: ${myserv.buildpath}</echo>
<condition property="isProduction">
<equals arg1="${buildstage.production}" arg2="${myserv.buildpath}" />
</condition>
<antcall target="production" />
<antcall target="development" />
</target>
<target name="production" if="${isProduction}">
<echo>Build Path: ${p.buildpath}</echo>
</target>
<target name="development" unless="${isProduction}">
<echo>Build Path: ${d.buildpath}</echo>
</target>
</project>
核心思想使用<conditional>
任务对选定的属性密钥进行测试,并调用两个名为production
和development
的任务,其中第一个任务在属性isProduction
为true时运行,第二个任务在不为true时(unlesss
)运行。
对照名为buildstage.production
的属性检查该条件,该属性被设置为属性关键字p.buildpath
作为鉴别器。
通过"属性键",我引用了属性文件中的键。这里的一堆"属性"可能会令人困惑:)
顺便说一句:您需要按如下方式转义属性值中的反斜杠,否则它们将不会被响应:
p.buildpath=c:\production\build
d.buildpath=c:\development\build
这篇文章是怎么说的(http://ant.apache.org/faq#propertyvalue-作为属性的名称),在没有任何外部帮助的情况下,这很棘手。
使用AntContrib(外部任务库),您可以执行<propertycopy name="prop" from="${anotherprop}"/>
。
不管怎样,在同一篇文章中还有其他选择。希望它能帮助你。
有一种更简单的方法不需要macrodef
或antcontrib:
<property name="a" value="Hello"/>
<property name="newProperty" value="a"/>
<loadresource property="b">
<propertyresource name="${newProperty}"/>
</loadresource>
<echo message="a='${a}'"/>
<echo message="b='${b}'"/>