2015-03-04 3 views
8

MS Visual Studio 2013.Почему атрибут `Condition` не работает для элемента` ItemGroup`?

Оба When и ItemGroup элементы могут иметь атрибут Condition (как я вижу, в MSDN). Но у меня разные результаты.

$(CAD_Year) Когда в 2015 я ожидаю, что AcRibbon будет не referensed к моему проекту:

<ItemGroup Condition= "'$(CAD_Year)' &lt; '2010'" >  
    <Reference Include="AcRibbon"> 
    <HintPath>$(CAD_SDK_Location)\$(Inc)\AcRibbon.dll</HintPath> 
    <Private>False</Private> 
    </Reference> 
</ItemGroup> 

Но я получаю неразрешенный ссылку в браузере Solution для AcRibbon всегда.

Но этот вариант работает отлично:

<Choose> 
    <When Condition= "'$(CAD_Year)' &lt; '2010'"> 
    <ItemGroup> 
     <Reference Include="AcRibbon"> 
     <HintPath>$(CAD_SDK_Location)\$(Inc)\AcRibbon.dll</HintPath> 
     <Private>False</Private> 
     </Reference> 
    </ItemGroup> 
    </When> 
</Choose> 

В этом случае AcRibbon упоминается только тогда, когда $(CAD_Year) меньше 2010 Почему я получаю разные результаты?

+0

ли в ItemGroup в 1-й пробе глобальной (определяется вне любой цели)? Если это так, возможной причиной является порядок оценки условий. Условие глобальной ItemGroup вычисляется до любого целевого запуска. Условие локальной ItemGroup рассчитывается при исходном целевом прогоне. Глобальные свойства вычисляются перед любыми предметными группами и целями. – Nikerboker

+0

Оба являются глобальными. –

+0

Вы уверены, что это не сработало? Visual Studio не очень хорошо демонстрирует условные ссылки при изменении конфигураций сборки, особенно если разные конфигурации компоновки ссылаются на объекты с тем же именем. Единственный способ проверить, работает ли он на самом деле или нет, - это построить его. Иногда вы получаете крест в обозревателе решений на изворотливой ссылке - безопасно оставить его в покое. –

ответ

14

Я нашел ответ в MSDN here:

Хотя условные операторы импорта работать в командной строке MSBuilds, они не работают с MSBuild в Visual Studio интегрированной среды разработки (IDE). Условный импорт оценивается по с использованием значений конфигурации и платформы, которые устанавливаются при загрузке проекта . Если впоследствии будут внесены изменения, требующие переоценки условных обозначений в файле проекта, например, , изменение платформы, Visual Studio переоценивает условия для свойств и элементов , но не для импорта. Поскольку импорт условный не переоценивается, импорт пропускается. Чтобы обойти это значение , поставьте условный импорт в .targets файлы или введите код в условный блок , такой как блок Select Element (MSBuild).

Я думаю, что это верно для ItemGroup элемента также ...

+0

Очень полезный ответ. Мне немного странно, что многие возможности MSBuild недоступны в среде IDE. – Codor

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