У меня есть пользовательское правило сборки в VS2010 для моего проекта VC++. В этом правиле я хотел бы разрешить пользователям добавлять сложные условия, определяющие, обрабатывается ли файл.
Это также необходимо оценивать во время целевого выполнения, а не в «Состоянии» самого «Элемент» (из-за того, что только проект «приложение» может его обработать и должен обрабатывать с настройками проект приложения, а не зависимые проекты).
Я попытался добавить настраиваемое поле к объекту, а затем просто удалить элементы из группы во время выполнения. например
<ItemGroup>
<MyItemType Remove="@(MyItemType)" Condition="!(%(MyItemType.IncludeCondition))" />
</ItemGroup>
К сожалению, это дает мне ошибку:
ошибка MSB4113: указанное условие "!(%(MyItemType.IncludeCondition))" оценивается как "!'testfilename1' == 'testfilename2' или false" вместо логического значения.
(Исходное выражение условия в «%(MyItemType.IncludeCondition)» было '%(Filename)' == 'testfilename2' or $(TestBooleanFalse)
)
Похоже, что MSBuild не будет оценивать содержимое метаданных элемента как логическое значение (что в большинстве случаев кажется хорошей практикой, но не в этом случае).
Могу ли я в любом случае заставить MSbuild фактически оценить метаданные до логического значения или есть какой-то другой метод, который я мог бы использовать для получения того же результата?
P.S. Я кратко ознакомился со свойством MSBuild . Functions, но не смог увидеть ничего, что могло бы запустить логический оценочный код MSBuild по входным данным функции)
Очень урезанный пример проекта MSBuild, показывающий проблему, любезно предоставлен Lanrokin:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="Build">
<ItemGroup>
<MyItemType Include="item1.ext1" />
<MyItemType Include="item1.ext2" />
</ItemGroup>
<Target Name="SpecifyConditions">
<ItemGroup>
<MyItemType>
<IncludeCondition>'%(Filename)%(Extension)' == 'item1.ext1'</IncludeCondition>
</MyItemType>
</ItemGroup>
</Target>
<Target Name="Build" DependsOnTargets="SpecifyConditions">
<Message Importance="high" Text="@(MyItemType)" Condition="%(MyItemType.IncludeCondition)" />
</Target>
</Project>
ItemGroup
в «SpecifyConditions» в «Remove» с условием, указанным как условие объявленияMyItemType
) - person Grant Peters   schedule 05.04.2013