2013-07-23 3 views
1

2 개의 별도 도구를 사용하여 생성하고 유효성을 검사해야하는 파일 형식이 있습니다. 가능한 한 점진적으로 처리하려고하므로 생성 된 파일의 유효성을 마지막으로 확인한 시점을 기억하는 0 파일 표식을 만들려고합니다. 나는 세대를 수정 된 파일에서만 재실행 시켰지만 검증은 수행하지 못했습니다.변환 된 입력을 그룹화하는 방법은 무엇입니까?

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

내가 그것을 생성, 그것을 처음 실행하고 두 항목의 유효성을 검사합니다 - 그 좋은를 : : 예를 들어

이이 .targets입니다 가정

> 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에 지시 할 수 있습니까?

+1

이 작업을 수행 할 수 있는지 확실하지 않습니다를 반복하지 않도록 수 있으면 좋겠다. 그러나 이와 같은 경우 정확한 msbuild 마법을 검색하는 데 시간을 소비하는 대신 CodeTaskFactory를 사용하고 C#의 두 줄을 작성하여 타임 스탬프를 비교합니다. 이 경우에는 ' $ ([System.IO.File] :: GetLastWriteTime ('@ (MyItem-> % (Filename) .gen.validated) '와 같은 속성을 만들 수도 있습니다. ToString())'를 비교하고, 동등하지 않을 때만 'touch'를 호출합니다. – stijn

답변

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> 

나는 아직도 내가 @(MyItem->'%(Filename).gen') 3 번 ...

관련 문제