2011-04-14 17 views
19

MSBuild görevinde bir XML dosyası oluşturmak istiyorum. MSBuild ile bir XML dosyası nasıl oluşturulur?

Ben dosyaların bir listesi var:

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

ben şöyle görünür XML oluşturmak istiyorum:

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

Bunu nasıl başarabiliriz? peşin

Teşekkür

Mike

cevap

29

Hızlı ve kirli ...

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

size

  • ilk < için bir tatbikat olarak sola mı? xml hattı
  • Girinti (< `Metin içindeki ipucu kullanımı CDATA>)

Ayrıca WriteLinesToFile aşağıdaki kullanabilir ve sentezlenen @ (LineText)

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

Bir seçenek, satır içi bir görev kullanmak olacaktır. Bu, Xml'yi oluşturmak için isteğe bağlı C# kodu yazmanıza olanak tanır, bu da alternatif çözümlerden daha kolay olabilir (veya daha zor olabilir). İşte benim bir yapı içinde bir NuGet nuspec dosyasını bir araya getirmek için kullandığım bir örnek.

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

Bazı alakalı belgeler:

UsingTaskElement

MSBuild inline tasks