Как мне остановить пакетную обработку элементов от выполнения партии, когда есть нулевые позиции? - PullRequest
14 голосов
/ 04 ноября 2010

Выполните это с помощью msbuild:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Main" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemGroup>
    <Colors Include="Blue">
      <Shade>Dark</Shade>
    </Colors>
  </ItemGroup>

  <Target Name="Main">
    <Message Text="Color: %(Colors.Shade) %(Colors.Identity)"/>
  </Target>

</Project>

И выводит:

Color: Dark Blue

Все хорошо, и хорошо, но удалите цвет и используйте это:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Main" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemGroup>
  </ItemGroup>

  <Target Name="Main">
    <Message Text="Color: %(Colors.Shade) %(Colors.Identity)"/>
  </Target>

</Project>

И выводит:

Color:

Почему выполняется одна партия задачи «Сообщение», если в группе нет элементов? Я ожидал бы, что будет ноль элементов, пакет будет выполнен ноль раз, и я не увижу «Color:», за которым ничего не следует.

Я что-то не так делаю или есть обходной путь для этого?

Спасибо.


Обновление: Я нашел, что вы можете сделать:

<Message Condition="'@(Colors)'!=''" Text="Color: %(Colors.Shade) %(Colors.Identity)"/>

Но, если вы чувствуете себя неудовлетворительным, приходится явно писать код для случая, когда нет элементов каждый раз, когда используется пакетная обработка.

Ответы [ 2 ]

11 голосов
/ 04 ноября 2010

Мои 2 цента:

В вашей Задаче сообщений есть информация из Пакетной и статической информации ("Цвета:").Я думаю, что MsBuild печатает статическую информацию, а затем группирует значения вашего элемента цветов.Проблема в том, что у вас нет данных в вашей коллекции (они даже не объявлены), я полагаю, что MsBuild интерпретирует это как пустой список, который, когда вы пытаетесь его распечатать, печатает пустую строку ''.

Если вы удалите статический контент («Цвета:» и пробел перед идентификатором), у вас ничего не отобразится.

Решение для печати с пакетной обработкой, только если коллекция элементов не пуста,быть либо:

  1. Проверить, является ли коллекция пустой

    <Message Condition="'@(Colors)'!=''" Text="Color: %(Colors.Shade) %(Colors.Identity)"/>
    
  2. Использовать Transform [1]

    <Message Text="@(Colors->'Color : %(Shade) %(Identity)')"/>
    

[1] http://msdn.microsoft.com/en-us/library/ms171476.aspx

5 голосов
/ 18 апреля 2013

Просто хотел добавить альтернативное решение для этого.Если вы можете изменить дозирование на Целевое дозирование, вместо Пакетное задание вы можете добавить свой оператор Условие в Целевое устройство.

Я добавил Целевое дозирование здесь:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Main" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemGroup>
  </ItemGroup>

  <Target Name="Main" Outputs="%(Colors.Identity)">
    <Message Text="Color: %(Colors.Shade) %(Colors.Identity)"/>
  </Target>

</Project>

...и это может быть условно выполнено только для выполнения, когда что-то существует в группе элементов Цвета:

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Main" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <ItemGroup>
  </ItemGroup>

  <Target Condition="'@(Colors)'!=''" Name="Main" Outputs="%(Colors.Identity)">
    <Message Text="Color: %(Colors.Shade) %(Colors.Identity)"/>
  </Target>

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