ant过滤 - 如果未设置属性,则失败

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ant过滤 - 如果未设置属性,则失败相关的知识,希望对你有一定的参考价值。

我有一个使用build.xml任务复制各种xml文件的ant <copy>。它使用过滤来合并build.properties文件中的属性。每个环境(dev,stage,prod)都有不同的build.properties,用于存储该环境的配置。

有时我们会向Spring XML或其他需要更新build.properties文件的配置文件添加新属性。

如果build.properties缺少属性,我希望ant快速失败。也就是说,如果任何原始@...@令牌进入生成的文件,我希望构建死亡,以便用户知道他们需要将一个或多个属性添加到他们的本地build.properties。

内置任务可以实现吗?我在文档中找不到任何内容。我即将编写一个自定义的ant任务,但也许我可以省力。

谢谢

答案

你可以在ant 1.7中使用LoadFile任务和match条件的组合来完成它。

<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"/>
另一答案

如果要查找特定属性,可以将fail任务与unless属性一起使用,例如:

<fail unless="my.property">Computer says no. You forgot to set 'my.property'!</fail>

有关更多详细信息,请参阅the documentation for Ant's fail task

另一答案

我打算建议您尝试使用<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"/>
另一答案

如果你的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"/>

对于有条件的

另一答案

由于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>

以上是关于ant过滤 - 如果未设置属性,则失败的主要内容,如果未能解决你的问题,请参考以下文章

set命令详解:开启,关闭shell功能属性

Ant:如何在使用“过滤”复制 xml 文件时对属性值进行 xml 转义

Junit ant 任务未将断言错误报告为失败

使用 Ant 任务为 Oracle 配置 worklight Server 失败

如果dataBound用于设置选定值,则Kendo UI Dropdownlist客户端过滤器不起作用

Angularjs模板默认值,如果绑定空/未定义(使用过滤器)