Подтвердить что ты не робот

Как создать файл XML с помощью MSBuild?

Я хотел бы создать XML файл в задаче MSBuild.

У меня есть список файлов:

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

Как я могу это достичь?

Заранее спасибо

Mike

4b9b3361

Ответ 1

Быстрая и грязная...

<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 внутри < `Text > )

Вы также можете использовать следующее в WriteLinesToFile и опустить синтезированный @(LineText)

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

Ответ 3

Один из вариантов - использовать встроенную задачу. Это позволяет вам написать произвольный код С# для генерации 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>
...

Некоторая соответствующая документация:

UseTaskElement

Встроенные задачи MSBuild