Как создать файл 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
Ответы
Ответ 1
Быстрая и грязная...
<Target Name="CreateXml">
<ItemGroup>
<TestAssembly Include="$(TestsAssembliesOutputDir)\Emidee.*.Tests.dll" />
<Line Include="line01"><Text><xunit></Text></Line>
<Line Include="line02"><Text><assemblies></Text></Line>
<Line Include="line03"><Text><assembly filename="%(TestAssembly.Identity)" shadow-copy="true" /></Text></Line>
<Line Include="line04"><Text></assemblies></Text></Line>
<Line Include="line05"><Text></xunit></Text></Line>
<LineText Include="%(Line.Text)" />
</ItemGroup>
<WriteLinesToFile
File="out.xml"
Lines="@(LineText)"
Overwrite="true"
/>
</Target>
В качестве упражнения для вас
- Начальная <? строка xml
- Отступы (подсказка использует CDATA внутри < `Text > )
Вы также можете использовать следующее в WriteLinesToFile и опустить синтезированный @(LineText)
Lines="@(Line->'%(Text)')"
Ответ 2
MSBuild Extension Pack имеет цель XmlFile.
Ответ 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