对于Ant脚本,我有以下myBuild.properties
文件
p.buildpath=c:\production\build
d.buildpath=c:\development\build
我写了以下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:\&GT;蚂蚁
我得到以下输出:
Buildfile:C:\ build.xml
信息: [输入]请输入服务器名称(p:生产,d:开发)? (p,d)
p
[echo]您的服务器类型:p
[echo]新物业价值:p.buildpath
[echo]构建路径:$ {$ {newProperty}}建立成功的作用 总时间:2秒
我想回应一下&#34; Build Path&#34;值与p.buildpath
值相同。
在上述情况下怎么办?
答案 0 :(得分:3)
采用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>
p.buildpath=c:\production\build
d.buildpath=c:\development\build
你会得到类似的东西:
[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
解决的非常类似的问题答案 1 :(得分:1)
你可以无需其他工具这样做(编辑/修订版):
<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
被视为真,则第二个(如果不是)unlesss
)。
针对名为buildstage.production
的属性检查条件,该属性设置为属性键p.buildpath
作为鉴别符。
使用“属性键”我引用属性文件中的键。这里有一堆“属性”可能令人困惑:)
顺便说一句:您需要在属性值中转义反斜杠,如下所示,否则它们将不会被回显:
p.buildpath=c:\\production\\build
d.buildpath=c:\\development\\build
答案 2 :(得分:0)
在这篇文章(http://ant.apache.org/faq#propertyvalue-as-name-for-property)中如何说明,没有任何外部帮助,这很棘手。
使用AntContrib(外部任务库),您可以执行<propertycopy name="prop" from="${anotherprop}"/>
。
无论如何,同一篇文章还有其他选择。 希望它可以帮到你。
答案 3 :(得分:0)
有一种更简单的方法,不需要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}'"/>