2013-11-07 5 views
0

У меня есть ItemGroup, которая содержит некоторые элементы, которые являются дубликатами друг друга. Я хотел бы выполнить задачу по модифицированной версии всех элементов в ItemGroup. Но до сих пор я не смог найти способ, который не удаляет дублированные элементы.MSBUILD, работающий с повторяющимися элементами в ItemGroup

Существует ли такое?

<ItemGroup> 
    <MyMessage Include="foo" /> 
    <MyMessage Include="bar" /> 
    <MyMessage Include="baz" /> 
    <MyMessage Include="foo" /> 
    <MyMessage Include="baz" /> 
    <MyMessage Include="baz" /> 
</ItemGroup> 

<Target Name="DemoBug"> 
    <Message Importance="High" Text="FIRST VERSION USING ItemGroup ..."/> 
    <Message Importance="High" Text="@(MyMessage)"/> 
    <Message Importance="High" Text="SECOND VERSION USING Batching and Metadata ..."/> 
    <Message Importance="High" Text="someprefix;%(MyMessage.Identity);somesuffix"/> 
</Target> 

В моем примере выше, первый выход версия имеет все элементы в нем, но выполняется только один раз задание сообщений на каскадных значений Items. Так что это совсем не то, чего я хочу.

5> FIRST VERSION USING ItemGroup ... 
5> foo;bar;baz;foo;baz;baz 

Второй вариант выполнения задачи Сообщение несколько раз, как я хочу, но это лишает дубликаты, которые я не хочу это делать.

5> SECOND VERSION USING Batching and Metadata ... 
5> someprefix;foo;somesuffix 
5> someprefix;bar;somesuffix 
5> someprefix;baz;somesuffix 

Это то, что я хочу сделать принципиально невозможно (в этом случае это может быть время, чтобы перейти на PowerShell для моей задачи), или есть какой-то разумный способ сделать это?

(В моей реальной задаче, элементы пришли из ReadLinesFromFile и, после различной обработки, будут в конечном итоге в WriteLinesToFile. Он отлично работает, за исключением того, когда дублированные линии встречаются)

ответ

3

MSBuild задача пакетирование не зацикливание. Он выполняет то, что он должен делать, группируя элементы в партиях, которые имеют одинаковые значения метаданных. В вашем примере это группировка% (Identity).

Будет ли операция преобразования объектов в вашем случае? Что-то вроде

<Message Importance="High" Text="@(MyMessage->'someprefix;%(Identity);somesuffix')"/>

+0

Не похоже. Он правильно не разделяет дубликаты, но он помещает их всех в один проход Message, объединяя элементы – PeteAC

+0

Разве это не то, что вы хотите? Для каждого элемента (включая дубликаты) вы получаете модифицированную версию. Задача Message сглаживается в строку, разделенную ';', но запись в файл должна обрабатывать их в порядке ... Вы также можете использовать другой разделитель, если хотите http://msdn.microsoft.com/en-us/ библиотека/VStudio/ms171476.aspx. – fsimonazzi

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