Передача элементов в задачу MSBuild
Я хотел бы использовать задачу "MSBuild" в моей цели для создания другого проекта, при этом передавая некоторые элементы (с их метаданными) из текущего проекта в проект, который будет построен.
Хотя можно передать свойства с помощью атрибута Properties или метаданных AdditionalProperties, я не смог найти способ передать Items.
Возможным решением может быть запись элементов в файл и передача имени файла как свойства, но при этом будут передаваться только элементы без их метаданных.
Любая идея?
Благодарю.
1 ответ
Довольно просто написать пользовательскую задачу для выгрузки элементов и их метаданных в файл, который будет выбран другим процессом. Вместо того, чтобы просто выгружать элементы в необработанном текстовом виде, создайте действительный файл проекта MSBuild, содержащий группу элементов (с метаданными элементов), и сгенерируйте этот файл, импортированный проектом, выполняемым задачей MSBuild. Вы даже можете использовать встроенную задачу MSBuild 4.0, чтобы выгрузить файл.
(ответ на комментарий)
<UsingTask
TaskName="WriteItemsWithMetadata"
TaskFactory="CodeTaskFactory"
AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" >
<ParameterGroup>
<OutputFile ParameterType="System.String" Required="true" />
<Items ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" />
</ParameterGroup>
<Task>
<Using Namespace="System.IO" />
<Code Type="Fragment" Language="cs">
<![CDATA[
// This code simplified with specific knowledge
// of the item metadata names. See ITaskItem
// documentation to enable writing out arbitrary
// meta data values
//
using (StreamWriter writer = new StreamWriter(OutputFile))
{
writer.Write("<?");
writer.WriteLine(" version=\"1.0\" encoding=\"utf-8\"?>");
writer.WriteLine("<Project xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\"");
writer.WriteLine(" ToolsVersion=\"4.0\">");
writer.WriteLine(" <ItemGroup>");
foreach (var item in Items)
{
string meta1 = item.GetMetadata("Meta1");
string meta2 = item.GetMetadata("Meta2");
writer.WriteLine(" <CopyItem Include=\"{0}\">", item.ItemSpec);
writer.WriteLine(" <Meta1>{0}</Meta1>", meta1);
writer.WriteLine(" <Meta2>{0}</Meta2>", meta2);
writer.WriteLine(" </CopyItem>");
}
writer.WriteLine(" </ItemGroup>");
writer.WriteLine("</Project>");
}
]]>
</Code>
</Task>
</UsingTask>
<ItemGroup>
<OriginalItem Include="A">
<Meta1>A1</Meta1>
<Meta2>A2</Meta2>
</OriginalItem>
<OriginalItem Include="B">
<Meta1>B1</Meta1>
<Meta2>B2</Meta2>
</OriginalItem>
</ItemGroup>
<Target Name="WriteItemsWithMetadata">
<WriteItemsWithMetadata
OutputFile="Out.props"
Items="@(OriginalItem)"
/>
<Exec Command="type Out.props" />
</Target>