2015-05-10 2 views
2

В MSBuild 12.0 можно ли включать файлы в <ItemGroup> только в том случае, если выполнено условие?ItemGroup включает файлы с условием

Мой вариант использования - это то, что я хочу создать коллекцию всех файлов .csproj, для которых существует файл .nuspec с таким же именем (без расширения).

- root_dir\ 
    - build.proj 
    - Project1\ 
     - Project1.csproj 
     - Project1.nuspec 
    - Project2\ 
     - Project2.csproj 
    - Project3\ 
     - Project3.csproj 
     - Project3.nuspec 

Я попытался сделать это с помощью преобразований MSBuild, но это не сработало.

<ItemGroup> 
    <ProjectWithNuspec Include="*\*.csproj" 
         Condition="Exists('@(ProjectWithNuspec->'%(Filename).nuspec')')"> 
</ItemGroup> 

Элемент ProjectWithNuspec, кажется, не быть инициализирован перед состояние оценивается.

я выяснить способ сделать это в два этапа:

  1. Включать все файлы
  2. Удалить файлы, которые не удовлетворяют условию
<ItemGroup> 
    <ProjectWithNuspec Include="*\*.csproj"> 
    <ProjectWithNuspec Remove="%(ProjectWithNuspec.Identity)" 
         Condition="!Exists('@(ProjectWithNuspec->'%(Filename).nuspec')')"> 
</ItemGroup> 

В идеале, I» d хотел бы иметь возможность сделать это за один шаг.

+0

Вы находитесь внутри элемента «Цель» или внутри элемента «Проект»? Я принимаю объект Target, когда вы используете ItemGroup Remove ... –

+0

Внутри элемента Target. –

ответ

5

Вы в основном делаете это лучше всего, что может быть выражено в MSBuild. Для этих видов преобразований вам почти всегда нужна промежуточная группа элементов, к которой вы добавляете дополнительные преобразования. Подумайте об этом как о конвейере, сначала вам нужны все файлы (они входят в группу 1), теперь мне нужны все файлы из группы 1, которые также соответствуют другому состоянию (группа 2).

<ItemGroup> 
    <AllProjects Include="$(MyDir)\**\*.csproj" />   
    <AllProjectsWithNuspec Include="@(AllProjects)" 
          Condition="Exists('%(RecursiveDir)%(FileName).nuspec')" /> 

</ItemGroup> 
+0

Я забыл о '% (RecursiveDir)'. –

Смежные вопросы