参数不是空的

时间:2011-06-15 07:49:07

标签: ant

我正在尝试检查ant build脚本的参数是否已设置。我尝试了很多方法,但没有成功。我用-Dmaindir="../propertyfolderpath"定义了参数。

以下是我尝试的代码示例;

<ac:if>
    <equals arg1="@{maindir}" arg2="" />
    <ac:then>
        <echo message="maindir argument is empty. Current properties will be used." />
        <property file="build.properties" />
    </ac:then>
    <ac:else>
        <echo message="maindir = ${maindir}" />
        <ac:if>
            <ac:available file="${maindir}/build.properties" type="file" />
            <ac:then>
                <property file="${maindir}/build.properties" />
            </ac:then>
            <ac:else>
                <fail message="${maindir} is not a valid path." />
            </ac:else>
        </ac:if>
    </ac:else>  
</ac:if>
  • 有三种情况;
    1. 可能未定义参数。 Ant应该进入第一个
    2. 论证定义得很好。
    3. 使用错误路径定义的参数

对于第二种情况,脚本正在运行。 对于第三种情况脚本正在运行。 但对于第一种情况,我的意思是当我不定义maindir论证时,ant就像第三种情况一样。这是我的问题。

为什么蚂蚁这样做?

2 个答案:

答案 0 :(得分:3)

也许您可以尝试为参数设置默认值?

<condition property="maindir" value="[default]">
    <not>  
        <isset property="maindir"/>
    </not>
</condition>
<echo message="${maindir}" />

我试过这个并且它有效,当没有传递任何参数时,${maindir}的值为[default]

答案 1 :(得分:1)

看起来有两个问题:

  1. 在第一个if的等于条件中,您有@{maindir}。除非它是宏的参数,否则应为${maindir},与示例的其余部分相同
  2. 如果尚未设置属性,则不会对其进行任何评估。因此,如果未定义maindir,${maindir}将评估为${maindir},而不是空字符串。
  3. 解决此问题的最简单方法是将@符号更改为$符号,并在开头添加一个语句,将属性默认为值:

    <property name="maindir" value="." />
    

    这会将属性默认为当前目录,因此您可以完全消除外部if,因为它将不再需要。 ant中的属性是只读的,所以如果用户明确指定了一个值(例如来自命令行),那么将使用该值代替,并且上面的行不会产生任何影响 - 只有当用户没有时它才会生效不要为maindir指定一个值。

    事实上,我认为你可以通过以下方式完全摆脱ant-contrib:

    <property name="maindir" value="." />
    <fail message="${maindir}/build.properties is not a valid path.">
        <condition>
            <not>
                <available file="${maindir}/build.properties" />
            </not>
        </condition>
    </fail>
    <property file="${maindir}/build.properties" />
    

    这应该与您希望通过示例实现的效果完全相同。