Можно ли изменить порядок элементов ItemGroup? - PullRequest
0 голосов
/ 14 июня 2010

В MSBuild 3.5 возможно ли изменить элементы заказа в ItemGroup?

Пример

У меня есть 2 проекта.Один может быть построен независимо, другой зависит от первого.Каждый проект ссылается на свои конкретные элементы в файле .targets.

project_A.targets

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <AssembliesToRemove Include="@(AssembliesToRemove)" />
        <AssembliesToRemove Include="Assembly_A.dll">
            <ApplicationName>App_A</ApplicationName>
        </AssembliesToRemove>
    </ItemGroup>

    <ItemGroup>
        <AssembliesToDeploy Include="@(AssembliesToDeploy)" />
        <AssembliesToDeploy Include="Assembly_A.dll">
            <AssemblyType>SomeType</AssemblyType>
            <ApplicationName>App_A</ApplicationName>
        </AssembliesToDeploy>
    </ItemGroup>
</Project>

project_B.targets

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <ItemGroup>
        <AssembliesToRemove Include="@(AssembliesToRemove)" />
        <AssembliesToRemove Include="Assembly_B.dll">
            <ApplicationName>App_B</ApplicationName>
        </AssembliesToRemove>
    </ItemGroup>

    <ItemGroup>
        <AssembliesToDeploy Include="@(AssembliesToDeploy)" />
        <AssembliesToDeploy Include="Assembly_B.dll">
            <AssemblyType>SomeType</AssemblyType>
            <ApplicationName>App_B</ApplicationName>
        </AssembliesToDeploy>
    </ItemGroup>
</Project>

project_A.proj

<Project DefaultTargets="Start" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Import Project="project_A.targets" />

    <Import Project="Common.targets" />
</Project>

project_B.proj

<Project DefaultTargets="Start" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Import Project="project_A.targets" />

    <Import Project="project_B.targets" />

    <Import Project="Common.targets" />
</Project>

Проблема

В этом сценарии проблема возникает во время обработки Задачи @(AssembliesToDeploy), так как Assembly_B.dll необходимо развернуть до Assembly_A.dll.

Обработка @(AssembliesToRemove) работает нормально, потому что здесь сборки находятся справапорядок (удалите Assembly_A.dll перед Assembly_B.dll).

То, что я пытался сделать

Я пытался повлиять на порядок @(AssembliesToDeploy), изменивproject_B.targets примерно так:

<ItemGroup>
    <AssembliesToDeploy Include="Assembly_B.dll">
        <AssemblyType>SomeType</AssemblyType>
        <ApplicationName>App_B</ApplicationName>
    </AssembliesToDeploy>
    <AssembliesToDeploy Include="@(AssembliesToDeploy)" />
</ItemGroup>

, но при использовании project_B.targets внутри project_B.proj порядок внутри @(AssembliesToDeploy) все еще остается Assembly_A.dll; Assembly_B.dll.

Редактировать

Как указывает MadGnome, это не сработает, потому что я получу дубликаты в @(AssembliesToDeploy)

Есть ли решение, которое позволило бы повторно использовать мои .targets, т.е. не копировать все элементы ItemGroup во все файлы .targets?

Ответы [ 2 ]

1 голос
/ 14 июня 2010

Вы просто должны включить project_B.targets перед project_A.

<Project DefaultTargets="Start" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Import Project="project_B.targets" />
  <Import Project="project_A.targets" />    

  <Import Project="Common.targets" />
</Project>

Я думаю, что в этом коде есть ошибка:

<ItemGroup>
  <!-- Generates duplicates if used with Import -->
  <AssembliesToDeploy Include="@(AssembliesToDeploy)" />

  <AssembliesToDeploy Include="Assembly_B.dll">
    <AssemblyType>SomeType</AssemblyType>
    <ApplicationName>App_B</ApplicationName>
  </AssembliesToDeploy>
</ItemGroup>

Вы используете Import, поэтому если вы используете код, указанный выше, у вас будет дубликатов в AssembliesToDeploy.

0 голосов
/ 15 июня 2010

Принятие ответа MadGnomes Я решил разбить ItemGroups на отдельные файлы .target.

project_A_REMOVE.targets

<Project xmlns="...">
    <ItemGroup>
        <AssembliesToRemove Include="@(AssembliesToRemove)" />
        <AssembliesToRemove Include="Assembly_A.dll">
            <ApplicationName>App_A</ApplicationName>
        </AssembliesToRemove>
    </ItemGroup>
</Project>

project_A_DEPLOY.targets

<Project xmlns="...">
    <ItemGroup>
        <AssembliesToDeploy Include="@(AssembliesToDeploy)" />
        <AssembliesToDeploy Include="Assembly_A.dll">
            <AssemblyType>SomeType</AssemblyType>
            <ApplicationName>App_A</ApplicationName>
        </AssembliesToDeploy>
    </ItemGroup>
</Project>

и то же самое для project_B.targets.

project_B.proj теперь выглядит следующим образом

<Project DefaultTargets="Start" xmlns="...">
    <Import Project="project_A_REMOVE.targets" />
    <Import Project="project_B_REMOVE.targets" />

    <Import Project="project_B_DEPLOY.targets" />
    <Import Project="project_A_DEPLOY.targets" />

    <Import Project="Common.targets" />
</Project>

Поскольку мое настоящее решение состоит из 58 проектов, это приведет к большому количеству целей.Тем более, что я должен держать общие цели для каждого проекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...