In accordance with the article, you copy and check the outputs:
<Copy SourceFiles="@(CompilationOutputs)" DestinationFolder="$(ReplicateSourceFolder)"/> <Exec Command="$(TF) checkin /comment:"Checking in file from build" "$(ReplicateSourceFolder)" /recursive"/>
Could you add a second copy of the line before validation to copy the xml files using metadata?
<Copy SourceFiles="%(CompilationOutputs.RootDir)%(CompilationOutputs.Directory)\%(CompilationOutputs.Filename).xml" DestinationFolder="$(ReplicateSourceFolder)"/>
Here is another option that uses a built-in task that creates another group of elements that changes the extension, so that it only adds doc files that actually exist:
<Target Name="Test"> <ChangeExtension InputFiles="@(CompilationOutputs)" Extension=".xml"> <Output TaskParameter="OutputFiles" ItemName="DocFiles" /> </ChangeExtension> <Copy SourceFiles="@(CompilationOutputs)" DestinationFolder="$(ReplicateSourceFolder)"/> <Copy SourceFiles="@(DocFiles)" DestinationFolder="$(ReplicateSourceFolder)"/> </Target> <UsingTask TaskName="ChangeExtension" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll"> <ParameterGroup> <InputFiles ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true"/> <Extension ParameterType="System.String" Required="true"/> <OutputFiles ParameterType="Microsoft.Build.Framework.ITaskItem[]" Output="true"/> </ParameterGroup> <Task> <Code Type="Fragment" Language="cs"> <![CDATA[ if (InputFiles.Length > 0) { List<TaskItem> results = new List<TaskItem>(); for (int i = 0; i < InputFiles.Length; i++) { ITaskItem item = InputFiles[i]; string path = item.GetMetadata("FullPath"); string docfile = Path.ChangeExtension(path, Extension); if (File.Exists(docfile)) { results.Add(new TaskItem(docfile)); } } OutputFiles = results.ToArray(); } ]]> </Code> </Task> </UsingTask>
Brian walker
source share