8

我想从我的 NAnt 脚本中调用某个 EXE,并在属性存在的情况下将属性作为参数传递,否则不传递任何内容。

下面的代码似乎只适合这种情况,但它不起作用:

<exec program="notepad.exe">
  <arg line="${file}" if="${property::exists('file')}" />
</exec>

它抛出Property 'file' has not been set错误。看起来它评估忽略条件的属性。我希望它忽略整个<arg>元素,以防它的条件是false.

如果我在此块上方定义属性,它显然可以正常工作(即使该属性为空)。如果它是一个单一的案例,它可能值得一个解决方法,但我必须以相同的方式传递许多属性。此外,<if>不是<exec>...下的有效元素

如何做到这一点?有任何想法吗?

4

3 回答 3

7

在 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>

它可以(并且将)在其他包含文件中被覆盖。

我还发现另一个线程问了同样的问题,一位参与 NAnt 开发的人建议表明人们是否对修复这个问题的补丁感兴趣<arg>。据我所知,没有人表现出兴趣:),因此行为没有改变。

我设法花一点时间调查修复可能是什么,似乎它只是添加ExpandProperties=falseTaskAttribute例如任务的line属性<arg>。对于<property value="...">按预期工作的属性也是如此。不过,我没有尝试过-如果这些天我有更多时间,我会在这里发布更新。

于 2012-09-25T13:00:53.537 回答
0

对于这种情况,您可以只使用文件集作为参数传递。默认情况下,文件集不包含与磁盘上的实际文件不匹配的项目。

于 2012-09-21T12:23:48.830 回答
0

我也遇到过这个问题(老实说不止一次)。-if属性在某些情况下不会像您期望的那样起作用。这是我丑陋的解决方法:

<choose>
  <when test="${property::exists('file')}">
    <exec program="notepad.exe">
      <arg line="${file}" />
    </exec>
  </when>
  <otherwise>
    <exec program="notepad.exe" />
  </otherwise>
</choose>
于 2012-09-22T06:35:52.597 回答