Как получить доступ к метаданным ItemGroup как свойствам в скрипте MSBuild
Возможно ли использовать технологию MSBuild по умолчанию для доступа к листингу в группе элементов в качестве свойства в msbuild? Я знаю, что могу сделать это в пользовательской задаче в C#, но я пытаюсь использовать встроенные возможности, если это возможно.
Пример:
У меня есть группа товаров:
<ItemGroup>
<SolutionToBuild Include="$(SolutionRoot)\Solutions\ClassLib\ClassLib.sln">
<Properties>
AssemblySigningKey=MySigningKey;
OutDir=$(BinariesRoot)\SomeLocation\;
LibraryName=ClassLib;
PlatformTarget=x86;
</Properties>
</SolutionToBuild>
<SolutionToBuild Include="$(SolutionRoot)\Solutions\BLAH\BLAH.sln">
<Properties>
ProjectType=Web;
</Properties>
</SolutionToBuild>
</ItemGroup>
Я хотел бы извлечь значение AssemblySigningKey
, если он существует, и поместите это значение в переменную MSBuild.
Я попробовал несколько методов, и самый близкий пример, который я мог найти, - это использование трансформации внутри отдельной цели, но даже это выглядит как хак, даже если бы я мог получить Condition
чтобы работать, я бы тогда должен был разобрать разбивку на =
, Нет ли стандартного метода для доступа к этим метаданным в группе товаров?
<Target Name="TransformProps"
Inputs="%(SolutionToBuild.Identity)"
Outputs="_Non_Existent_Item_To_Batch_">
<PropertyGroup>
<IncludeProps>%(SolutionToBuild.Properties)</IncludeProps>
</PropertyGroup>
<ItemGroup>
<IncludeProps Include="$(IncludeProps)" />
<Solution Include="@(SolutionToBuild)">
<IncludeProps Condition="'True'=='True' ">@(IncludeProps ->'-PROP %(Identity)', ' ')</IncludeProps>
</Solution>
</ItemGroup>
</Target>
Моей главной целью было бы вызвать преобразование следующим образом:
<Target Name="Main" DependsOnTargets="TransformProps">
<Message Text="Solution info: %(Solution.Identity) %(Solution.IncludeProps)" />
</Target>
1 ответ
Элементы Метаданные объявляются и преобразуются с использованием тегов XML. Похоже, вы используете задачу MSBuild для построения некоторых решений - тег свойств является параметром, характерным для этой задачи.
Преобразование из списка и элементов, разделенных запятыми, как вы пытались, не поможет, потому что, как вы упоминали, у вас все еще есть знак равенства в виде ссылки между ключами и значениями. Я думаю, что нет способа получить значение ключа подписи без разбора. Ведь msbuild не рассматривает список свойств как метаданные, это просто список строк.
Я сделал сценарий ниже, чтобы проиллюстрировать, как msbuild объявляет и читает метаданные. Это не вариант для вас, потому что ваша структура ItemGroup не может быть изменена.
ИМХО в этом случае у вас нет выбора, кроме как использовать пользовательское задание и выполнить анализ. Используйте встроенные задачи, если вы строите с помощью msbuild 4.0.
<?xml version="1.0" encoding="UTF-8" ?>
<Project DefaultTargets="Main" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<SolutionToBuild Include="$(SolutionRoot)\Solutions\ClassLib\ClassLib.sln">
<AssemblySigningKey>MySigningKey123</AssemblySigningKey>
<Properties>
AssemblySigningKey=MySigningKey456;
OutDir=$(BinariesRoot)\SomeLocation\;
LibraryName=ClassLib;
PlatformTarget=x86;
</Properties>
</SolutionToBuild>
</ItemGroup>
<Target Name="TransformProps">
<PropertyGroup>
<MySigningKey>@(SolutionToBuild->'%(AssemblySigningKey)')</MySigningKey>
</PropertyGroup>
</Target>
<Target Name="Main" DependsOnTargets="TransformProps">
<Message Text="My desired Property Value: $(MySigningKey)" />
</Target>