1

2 つの個別のツールを使用して、生成してから検証する必要があるファイル タイプがあります。できるだけ段階的に実行したいので、生成されたファイルが最後にいつ検証されたかを記憶する 0 ファイル マーカーを作成したいと考えています。変更されたファイルでのみ生成を再実行することができましたが、検証は実行できませんでした。

たとえば、これが .targets であるとします。

<Project ToolsVersion="4.0" DefaultTargets="Validate" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <MyItem Include="itemA" />
    <MyItem Include="itemB" />
  </ItemGroup>

  <Target Name="Generate"
          Inputs="@(MyItem)"
          Outputs="@(MyItem->'%(Filename).gen')">
    <Copy SourceFiles="@(MyItem)" DestinationFiles="@(MyItem->'%(Filename).gen')" />
  </Target>

  <Target Name="Validate" DependsOnTargets="Generate"
          Inputs="@(MyItem->'%(Filename).gen')"
          Outputs="@(MyItem->'%(Filename).gen.validated')">
    <!-- Do validation stuff... -->
    <Touch AlwaysCreate="true" Files="@(MyItem->'%(Filename).gen.validated')" />
  </Target>
</Project>

初めて実行すると、両方のアイテムが生成され、検証されます-それは良いことです:

> msbuild
Generate:
  Copying file from "itemA" to "itemA.gen".
  Copying file from "itemB" to "itemB.gen".
Validate:
  Creating "itemA.gen.validated" because "AlwaysCreate" was specified.
  Creating "itemB.gen.validated" because "AlwaysCreate" was specified.

もう一度実行しても、何も行われません - それは素晴らしいことです:

> MSBuild
Generate:
Skipping target "Generate" because all output files are up-to-date with respect to the input files.
Validate:
Skipping target "Validate" because all output files are up-to-date with respect to the input files.

itemA だけを変更します。

> touch itemA
> MSBuild
Generate:
Building target "Generate" partially, because some output files are out of date with respect to their input files.
  Copying file from "itemA" to "itemA.gen".     <<<<< Good - MSBuild knows not to generate itemB.gen
Validate:
  Touching "itemA.gen.validated".
  Touching "itemB.gen.validated".    <<<< Bad - how can I tell MSBuild to skip validation of itemB

Validateでは、ターゲットを部分的に実行するように MSBuild に指示するにはどうすればよいでしょうか?

4

1 に答える 1

0

解決策: 変換された入力を別の ItemGroup に保持します。このような:

<Project ToolsVersion="4.0" DefaultTargets="Validate" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <MyItem Include="itemA" />
    <MyItem Include="itemB" />
  </ItemGroup>

  <Target Name="Generate"
          Inputs="@(MyItem)"
          Outputs="@(MyItem->'%(Filename).gen')">
    <Copy SourceFiles="@(MyItem)" DestinationFiles="@(MyItem->'%(Filename).gen')" />
    <ItemGroup>
      <Generated Include="@(MyItem->'%(Filename).gen')" />
    </ItemGroup>
  </Target>

  <Target Name="Validate" DependsOnTargets="Generate"
          Inputs="@(Generated)"
          Outputs="@(Generated->'%(Filename).gen.validated')" >
    <!-- Do validation stuff... -->
    <Touch AlwaysCreate="true" Files="@(Generated->'%(Filename).gen.validated')" />
  </Target>
</Project>

3回繰り返すのは避けたいのですが@(MyItem->'%(Filename).gen')

于 2013-07-24T15:54:30.340 に答える