2011-04-14 6 views
19

MSBuild 작업 내에 XML 파일을 만들고 싶습니다. MSBuild를 사용하여 XML 파일을 만드는 방법은 무엇입니까?

나는 파일의 목록이 있습니다

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

내가 같이 것 XML을 생성하고 싶습니다 :

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

  • 초기 <에 대한 연습으로 왼쪽? XML 라인
  • 들여 쓰기 (<`텍스트 내부 힌트 사용 CDATA>)

는 또한 WriteLinesToFile에서 다음을 사용하여 합성 @ (LineText)

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

하나의 옵션은 인라인 작업을 사용하는 것입니다. 이를 통해 임의의 C# 코드를 작성하여 대체 솔루션보다 쉽거나 더 어려울 수있는 Xml을 생성 할 수 있습니다. 다음은 빌드에서 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

관련 문제