2011-04-14 13 views
19

मैं एक एमएसबिल्ड कार्य के भीतर एक एक्सएमएल फ़ाइल बनाना चाहता हूं।MSBuild के साथ एक XML फ़ाइल कैसे बनाएं?

मैं फ़ाइलों की एक सूची है:

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

मैं एक एक्सएमएल जो कैसा दिखेगा बनाना चाहते हैं:

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

मैं ऐसा कैसे हासिल कर सकते हैं?

अग्रिम धन्यवाद

माइक

उत्तर

29

त्वरित और गंदे ...

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

आप

  • प्रारंभिक < के लिए एक व्यायाम के रूप वाम? एक्सएमएल लाइन
  • इंडेंटेशन (संकेत उपयोग CDATA अंदर < `पाठ>)

तुम भी WriteLinesToFile में निम्नलिखित का उपयोग करें और छोड़ देते हैं संश्लेषित @ (LineText)

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

एक विकल्प इनलाइन कार्य का उपयोग करना होगा। यह आपको एक्सएमएल उत्पन्न करने के लिए मनमानी सी # कोड लिखने की अनुमति देता है, जो वैकल्पिक समाधानों की तुलना में आसान (या कठिन हो सकता है) हो सकता है। यहां एक उदाहरण दिया गया है कि मैं अपने निर्माण में एक NuGet nuspec फ़ाइल को एक साथ हैक करने के लिए उपयोग कर रहा था।

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

कुछ प्रासंगिक दस्तावेज:

UsingTaskElement

MSBuild inline tasks

संबंधित मुद्दे