我想根据前缀"映射"一堆蚂蚁属性(听起来很简单)。
我有一个解决方案,但它并不优雅(必须写出到属性文件,然后读回去!
问:是否有一种更快/更通用/更简单/开箱即用/直接的方法在 ANT 中执行以下"加载属性集"?(...比我在下面提供的示例)
(大致类似于 Groovy> ConfigSlurper>特殊环境配置行为。
例如:
<?xml version="1.0" encoding="UTF-8"?>
<project name="Config">
<!-- Section 1. (These will be loaded from a property file...) -->
<property name="a.yyy" value="foo" />
<property name="a.zzz" value="cat" />
<property name="b.xxx" value="bar" />
<property name="b.zzz" value="dog" />
<macrodef name="load-propertyset">
<attribute name="prefix" />
<attribute name="outfile" default="123" />
<attribute name="propset" default="123" />
<sequential>
<propertyset id="@{propset}">
<propertyref prefix="@{prefix}" />
<globmapper from="@{prefix}.*" to="*" />
</propertyset>
<echo level="debug">Created propertyset - '@{propset}' from prefix='@{prefix}'</echo>
<tempfile property="@{outfile}" suffix=".properties" deleteonexit="true" />
<echo level="debug">Writing propset to temp file - '${@{outfile}}'</echo>
<echoproperties destfile="${@{outfile}}">
<propertyset refid="@{propset}"/>
</echoproperties>
<echo level="debug">Reading props from temp file - '${@{outfile}}'</echo>
<property file="${@{outfile}}" />
<delete file="${@{outfile}}" />
</sequential>
</macrodef>
<load-propertyset prefix="a" />
<load-propertyset prefix="b" />
<echo>>>> Using variables xxx=${xxx} yyy=${yyy} zzz=${zzz}</echo>
</project>
我确定我错过了一些简单的东西,例如:
- 是否可以引用属性集中的属性?(例如 ${myprops.yyy} ?)
- 我想避免像${${filter}.hostname}这样的东西。
第三方 Ant-Contrib 有一个<antcallback>
任务,该任务接受<antcall>
任务并添加将属性返回给调用方的功能:
<?xml version="1.0" encoding="UTF-8"?>
<project name="Config" default="run">
<taskdef resource="net/sf/antcontrib/antlib.xml" />
<!-- Section 1. (These will be loaded from a property file...) -->
<property name="a.yyy" value="foo" />
<property name="a.zzz" value="cat" />
<property name="b.xxx" value="bar" />
<property name="b.zzz" value="dog" />
<macrodef name="load-propertyset">
<attribute name="prefix" />
<attribute name="return" />
<sequential>
<antcallback target="-empty-target" return="@{return}">
<propertyset>
<propertyref prefix="@{prefix}" />
<globmapper from="@{prefix}.*" to="*" />
</propertyset>
</antcallback>
</sequential>
</macrodef>
<target name="-empty-target"/>
<target name="run">
<property name="properties-to-return" value="xxx,yyy,zzz"/>
<load-propertyset prefix="a" return="${properties-to-return}"/>
<load-propertyset prefix="b" return="${properties-to-return}"/>
<echo>>>> Using variables xxx=${xxx} yyy=${yyy} zzz=${zzz}</echo>
</target>
</project>
properties-to-return
概念有点维护负担。幸运的是,当被要求返回未设置的属性时,<antcallback>
不会失败。当您需要新的映射属性时,只需要修改properties-to-return
属性。