我正在尝试检查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>
对于第二种情况,脚本正在运行。 对于第三种情况脚本正在运行。 但对于第一种情况,我的意思是当我不定义maindir论证时,ant就像第三种情况一样。这是我的问题。
为什么蚂蚁这样做?
答案 0 :(得分:3)
也许您可以尝试为参数设置默认值?
<condition property="maindir" value="[default]">
<not>
<isset property="maindir"/>
</not>
</condition>
<echo message="${maindir}" />
我试过这个并且它有效,当没有传递任何参数时,${maindir}
的值为[default]
。
答案 1 :(得分:1)
看起来有两个问题:
@{maindir}
。除非它是宏的参数,否则应为${maindir}
,与示例的其余部分相同${maindir}
将评估为${maindir}
,而不是空字符串。解决此问题的最简单方法是将@符号更改为$符号,并在开头添加一个语句,将属性默认为值:
<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" />
这应该与您希望通过示例实现的效果完全相同。