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メーリング リスト で古いスレッドを見つけましたが、これは実際に (私の場合) 回避策の最良の提案を提供します。<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=falseすることだけのようです。期待どおりに機能する属性についても同じことが行われます。しかし、私はそれを試していませんでした - もし私が最近もう少し時間があれば、私はここにアップデートを投稿します.TaskAttributeline<arg><property value="...">

于 2012-09-25T13:00:53.537 に答える
0

その場合、ファイルセットを使用して引数として渡すことができます。デフォルトでは、fileset には、ディスク上の実際のファイルと一致しないアイテムは含まれません。

于 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 に答える