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