-1

Targetファイルが存在しない場合に一度実行したいがありますItemGroup

<ItemGroup>
    <Foo Include="a.txt;b.txt;c.txt" />
</ItemGroup>
<Target Name="Bar" Condition="?">

私の質問は、「?」に何を入れるかです。

4

1 に答える 1

1

別のターゲットを使用してファイル リストを調べ (ターゲットの得意分野です!)、結果をプロパティに残すことができます。テスター ターゲットとバーに依存するラッパー ターゲットを作成します。バーには、最初のターゲットによって設定されたメカニズムを使用する条件があります。

タスク内で設定されたグローバル プロパティは、そのタスクが終了するまで表示されないことに注意してください。そのため、イディオムは、結果を生成するものと結果を消費するものを空のタスクの依存関係としてラップすることです。

順序が正しいことを確認するために、テスターも Bar の依存関係にする必要があると思います。

このようなもの:

<Target Name="TestLoop" Outputs="%(Foo.Identity)">
    <PropertyGroup>
        <Tested Condition="Exists(%(Foo.Identity))">Present</Tested>
    </PropertyGroup>
</Target>

TestLoop がトリガーされた後、少なくとも 1 つのファイルが存在する場合にのみ、Property Tested が「Present」に設定されます。つまり、ループする論理 OR をコーディングします。

これを依存関係として使用する場合:

<Target Name="Wrapper" DependsOnTargets="TestLoop;Bar" />

次に、TestLoop によって残された状態を Bar に見てもらうことができます。並列ではなく、正しい順序で実行されると仮定します! それを確実にするために、TestLoop を Bar の前提条件にもすると、ビルド エンジンは必要なシーケンスを決定し、TestLoop が完了するまで Bar を試行しないことを認識します。

ああ、Wrapper は求めるターゲットです。上記のように、Bar を直接要求すると、プロパティの更新は表示されません (と思います)。したがって、それらに名前を付けて、Wrapper を公開された Bar にし、Bar を内部の Bar_helper にすることができます。

于 2014-11-11T15:13:44.497 に答える