我想从我的NAnt脚本中调用某个EXE,并在属性存在时传递属性作为参数,否则不传递任何内容。
下面的代码似乎只适用于这种情况,但它不起作用:
<exec program="notepad.exe">
<arg line="${file}" if="${property::exists('file')}" />
</exec>
抛出Property 'file' has not been set
错误。看起来它会评估忽略条件的属性。如果条件为<arg>
,我希望它忽略整个false
元素。
如果我在此块上方定义属性,它显然可以正常工作(即使该属性为空)。如果它是一个案例,它可能值得一个解决方法,但我必须以同样的方式传递许多属性。此外,<if>
不是<exec>
...
如何实现这一目标?有什么想法吗?
答案 0 :(得分:7)
我掏出an old thread at NAnt mailing list,这实际上提供了一个解决方法的最佳建议(对我而言)。它基于<property>
任务按预期工作的事实。解决方法引入了一个额外的属性来设置,具体取决于是否定义了原始属性。
像这样:
<target name="example">
<property name="arg.value" value="${arg}" if="${property::exists('arg')}" />
<property name="arg.value" value="" unless="${property::exists('arg')}" />
<exec program="program.exe">
<arg value="${arg.value}" />
</exec>
</target>
在我的情况下,总是设置一个具有默认值的属性更容易,甚至不引入额外的属性 - 只需将原始属性传递给<arg/>
:
<target name="example">
<property name="arg.value" value="default value" overwrite="false" />
<exec program="program.exe">
<arg value="${arg.value}" />
</exec>
</target>
它可以(并且将会)在其他包含文件中被覆盖。
我还找到了another thread where the same question was asked,参与NAnt开发的人建议说明人们是否对修补<arg>
元素的补丁感兴趣。据我所见,没有人表现出兴趣:),因此行为没有改变。
我设法花了一点时间调查一下修补程序可能是什么,而且似乎只是将ExpandProperties=false
添加到TaskAttribute
,例如line
任务的<arg>
属性。 <property value="...">
属性也是如此,它按预期工作。我没有尝试过 - 如果我有更多的时间,我会在这里发布更新。
答案 1 :(得分:0)
对于这种情况,您可以使用文件集作为参数传递。默认情况下,fileset不包含与磁盘上的实际文件不匹配的项目。
答案 2 :(得分:0)
我也遇到过这个问题(老实说甚至不止一次)。在某些情况下,if
- 属性并不像您预期的那样有效。这是我丑陋的解决方法:
<choose>
<when test="${property::exists('file')}">
<exec program="notepad.exe">
<arg line="${file}" />
</exec>
</when>
<otherwise>
<exec program="notepad.exe" />
</otherwise>
</choose>