我有一个使用build.xml
任务复制各种xml文件的ant <copy>
。它使用过滤来合并build.properties
文件中的属性。每个环境(dev,stage,prod)都有一个不同的build.properties
,用于存储该环境的配置。
有时我们会向Spring XML或需要更新build.properties
文件的其他配置文件添加新属性。
如果build.properties
中缺少某些属性,我希望ant快速失败。也就是说,如果任何原始@...@
令牌进入生成的文件,我希望构建死亡,以便用户知道他们需要将一个或多个属性添加到他们的本地build.properties。
内置任务可以实现吗?我在文档中找不到任何内容。我即将编写一个自定义的ant任务,但也许我可以省力。
由于
答案 0 :(得分:98)
如果您正在寻找特定属性,可以使用带有除属性的失败任务,例如:
<fail unless="my.property">Computer says no. You forgot to set 'my.property'!</fail>
有关详细信息,请参阅the documentation for Ant's fail task。
答案 1 :(得分:19)
您可以使用LoadFile
任务和match
条件的组合在ant 1.7中执行此操作。
<loadfile property="all-build-properties" srcFile="build.properties"/>
<condition property="missing-properties">
<matches pattern="@[^@]*@" string="${all-build-properties}"/>
</condition>
<fail message="Some properties not set!" if="missing-properties"/>
答案 2 :(得分:4)
我打算建议您尝试使用<property file="${filter.file}" prefix="filter">
将属性实际加载到Ant中,然后fail
如果未设置任何属性,但我认为我正在解释您的问题是错误的(如果未在属性文件中设置指定的属性,则希望失败。)
我认为您最好的选择可能是使用<exec>
(取决于您的开发平台)为“@”字符执行grep,然后将属性设置为找到的出现次数。不确定语法,但......
<exec command="grep \"@\" ${build.dir} | wc -l" outputproperty="token.count"/>
<condition property="token.found">
<not>
<equals arg1="${token.count}" arg2="0"/>
</not>
</condition>
<fail if="token.found" message="Found token @ in files"/>
答案 3 :(得分:0)
如果在您的ant版本中不推荐使用exec命令,则可以使用重定向器,例如:
<exec executable="grep">
<arg line="@ ${build.dir}"/>
<redirector outputproperty="grep.out"/>
</exec>
<exec executable="wc" inputstring="${grep.out}">
<arg line="-l"/>
<redirector outputproperty="token.found"/>
</exec>
创建token.found属性
<condition property="token.found">
<not>
<equals arg1="${token.count}" arg2="0"/>
</not>
</condition>
<fail if="token.found" message="Found token @ in files"/>
for conditonal
答案 4 :(得分:0)
由于Ant 1.6.2 condition
也可以嵌套在fail
内。
以下宏可以轻松有条件地检查多个属性。
<macrodef name="required-property">
<attribute name="name"/>
<attribute name="prop" default="@{name}"/>
<attribute name="if" default="___"/>
<attribute name="unless" default="___"/>
<sequential>
<fail message="You must set property '@{name}'">
<condition>
<and>
<not><isset property="@{prop}"/></not>
<or>
<equals arg1="@{if}" arg2="___"/>
<isset property="@{if}"/>
</or>
<or>
<equals arg1="@{unless}" arg2="___"/>
<not><isset property="@{unless}"/></not>
</or>
</and>
</condition>
</fail>
</sequential>
</macrodef>
<target name="required-property.test">
<property name="prop" value=""/>
<property name="cond" value="set"/>
<required-property name="prop"/>
<required-property name="prop" if="cond"/>
<required-property name="prop" unless="cond"/>
<required-property name="prop" if="cond2"/>
<required-property name="prop" unless="cond2"/>
<required-property name="prop" if="cond" unless="cond"/>
<required-property name="prop" if="cond" unless="cond2"/>
<required-property name="prop" if="cond2" unless="cond"/>
<required-property name="prop" if="cond2" unless="cond2"/>
<required-property name="prop2" unless="cond"/>
<required-property name="prop2" if="cond2"/>
<required-property name="prop2" if="cond2" unless="cond"/>
<required-property name="prop2" if="cond" unless="cond"/>
<required-property name="prop2" if="cond2" unless="cond2"/>
<required-property name="success"/>
</target>