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>