欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ant编译重设property的值

程序员文章站 2022-07-13 13:43:28
...

ant已经有N多种替代方案了,但也不是ant就没有可用之外了,它的跨平台性还是有很大的优势。

android就经常是使用ant来构建的。

 

ant脚本中property默认是不能重新设置值的,第一次定义之后,在整个project执行过程中是不会再变的。

最简单的定义方式如下:

 

<property name="build.target" value="release" />

但是在我们的编译脚本中经常有可能需要用到可以变的值,另一种值设值方式可以满足我们:

 

<var name="build.target" value="release" />

定义变量可以随时重新设值,但是又有一点,如果我们需要使用condition来条件设值的时候,不好意思,不支持var。 

<condition property="BATCH_INPUT" value="${env.BATCH_INPUT}" else="${local.BATCH_INPUT}">
          <isset property="env.BATCH_INPUT" />
</condition>

 

直接点,要property支持重设,也不是不可能,在jdk 1.6之后,使用contrib可以支持,需要定义一个重设的脚本,需要下ant-contrib-0.6.jar到ant的lib目录下

<scriptdef name="propertyreset" language="javascript"
   		description="Allows to assign @{property} new value">
    	<attribute name="name"/>
    	<attribute name="value"/>
       	project.setProperty(attributes.get("name"), attributes.get("value"));
</scriptdef>

同时增加以下一行声明:

<taskdef resource="net/sf/antcontrib/antlib.xml" />

 

用法如下:

<propertyreset name="chanel" value="${chanelname}"/>

 这样子就可以直接使用新值了。

本帖完整的示例:

 

<project name="test" default="testA" basedir="."> 
    
     <!--必须定义这个标签-->
    <taskdef resource="net/sf/antcontrib/antlib.xml" /> 
    
    <scriptdef name="propertyreset" language="javascript"
    		description="Allows to assign @{property} new value">
   		  <attribute name="name"/>
    		<attribute name="value"/>
        project.setProperty(attributes.get("name"), attributes.get("value"));
		</scriptdef>


 		<property name="nameA" value="A"/>
 		<!--重新定义property,不起作用-->
 		<property name="nameA" value="B"/>
 		
 		<var name="nameB" value="A"/>
 		<!--var可以随意设置值-->
 		<var name="nameB" value="B"/>
 		
 		
 		<property name="nameC" value="A"/>
 		<!--使用自定义的脚本重新设置值-->
 		<propertyreset name="nameC" value="B"/>
 		
    
    
   <target name='testA'> 
     <echo>${nameA}</echo>
     <echo>${nameB}</echo> 
     <echo>${nameC}</echo>  
   </target> 
</project>