2011-04-14 29 views
19

Me gustaría crear un archivo XML dentro de una tarea de MSBuild.¿Cómo crear un archivo XML con MSBuild?

que tienen una lista de archivos:

<CreateItem Include="$(TestsAssembliesOutputDir)\Emidee.*.Tests.dll"> 
    <Output ItemName="TestsAssemblies" TaskParameter="Include" /> 
</CreateItem> 

Me gustaría crear un XML, que se vería así:

<?xml version="1.0" encoding="utf-8"?> 
<xunit> 
    <assemblies> 
    <assembly filename="PATH OF FILE #1" shadow-copy="true" /> 
    <assembly filename="PATH OF FILE #2" shadow-copy="true" /> 
    </assemblies> 
</xunit> 

¿Cómo puedo lograr eso?

Gracias de antemano

Mike

Respuesta

29

rápida y sucia ...

<Target Name="CreateXml"> 
    <ItemGroup> 
    <TestAssembly Include="$(TestsAssembliesOutputDir)\Emidee.*.Tests.dll" /> 
    <Line Include="line01"><Text>&lt;xunit&gt;</Text></Line> 
    <Line Include="line02"><Text>&lt;assemblies&gt;</Text></Line> 
    <Line Include="line03"><Text>&lt;assembly filename=&quot;%(TestAssembly.Identity)&quot; shadow-copy=&quot;true&quot; /&gt;</Text></Line> 
    <Line Include="line04"><Text>&lt;/assemblies&gt;</Text></Line> 
    <Line Include="line05"><Text>&lt;/xunit&gt;</Text></Line> 
    <LineText Include="%(Line.Text)" /> 
    </ItemGroup> 
    <WriteLinesToFile 
    File="out.xml" 
    Lines="@(LineText)" 
    Overwrite="true" 
    /> 
</Target> 

deja como ejercicio para usted

  • El < inicial? línea xml
  • sangría (utilización indirecta CDATA dentro < `texto>)

También podría usar lo siguiente en WriteLinesToFile y omitir el @ sintetizado (LineText)

Lines="@(Line->'%(Text)')" 
0

Una opción sería usar una tarea en línea. Esto le permite escribir código C# arbitrario para generar el Xml, que podría ser más fácil (o podría ser más difícil) que las soluciones alternativas. Aquí hay un ejemplo que estaba usando para hackear juntos un archivo NuGet nuspec en mi compilación.

... 
<UsingTask 
     TaskName="CreateNugetPackage" 
     TaskFactory="CodeTaskFactory" 
     AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" 
    > 
     <ParameterGroup> 
      <ProjectName ParameterType="System.String" Required="true" /> 
      <Version ParameterType="System.String" Required="true" /> 
      <BaseFolder ParameterType="System.String" Required="true" /> 

      <Files ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" /> 
      <OutputFile ParameterType="Microsoft.Build.Framework.ITaskItem" Required="true" /> 
     </ParameterGroup> 

     <Task> 
      <Reference Include="System.Xml" /> 
      <Using Namespace="System" /> 
      <Using Namespace="System.Xml" /> 
      <Code Type="Fragment" Language="cs"> 
       <![CDATA[ 
       var root = Path.GetFullPath(BaseFolder);  

       using (var w = XmlWriter.Create(OutputFile.ItemSpec)) { 
        var ns = "http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"; 
        w.WriteStartElement("package", ns); 

        w.WriteStartElement("metadata"); 

        w.WriteStartElement("id"); 
        w.WriteValue(ProjectName); 
        w.WriteEndElement(); 
        w.WriteStartElement("version"); 
        w.WriteValue(Version); 
        w.WriteEndElement(); 
        w.WriteStartElement("description"); 
        w.WriteValue("Test"); 
        w.WriteEndElement(); 

        w.WriteStartElement("authors"); 
        w.WriteValue("Test"); 
        w.WriteEndElement(); 

        w.WriteEndElement(); 


        w.WriteStartElement("files"); 

        foreach(var file in Files) { 
         w.WriteStartElement("file"); 
         var inFile = file.ItemSpec; 
         inFile = inFile.Replace(root, ""); 
         w.WriteAttributeString("src", inFile); 
         w.WriteAttributeString("target", inFile); 
         w.WriteEndElement(); 
        } 

        w.WriteEndElement(); 

        w.WriteEndElement(); 
       } 

    ]]> 
      </Code> 
     </Task> 
    </UsingTask> 


    <Target Name="CreateNuspec" BeforeTargets="BuildNugetPackage"> 

     <CreateNugetPackage 
      Files="@(Artifacts)" 
      OutputFile="$(NugetPackageSpec)" 
      ProjectName="$(ProjectName)" 
      BaseFolder="$(ArtifactRoot)" 
      Version="$(Version)" 
      /> 
    </Target> 
... 

Parte de la documentación pertinente:

UsingTaskElement

MSBuild inline tasks

Cuestiones relacionadas