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