Как получить доступ к метаданным 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>
Другие вопросы по тегам