Why the `Condition` attribute doesn't work for the `ItemGroup` element?
I found the answer in MSDN here:
While conditional import statements work in command-line MSBuilds, they do not work with MSBuild in the Visual Studio integrated development environment (IDE). Conditional imports are evaluated by using the configuration and platform values that are set when the project is loaded. If changes are subsequently made that require a reevaluation of the conditionals in the project file, for example, changing the platform, Visual Studio reevaluates the conditions on properties and items, but not on imports. Because the import conditional is not reevaluated, the import is skipped. To work around this, put conditional imports in the .targets files or put code in a conditional block such as a Choose Element (MSBuild) block.
I think this is true for ItemGroup
element also...
Related videos on Youtube
Comments
-
Andrey Bushman almost 2 years
MS Visual Studio 2013.
Both
When
andItemGroup
elements can to have theCondition
attribute (as I see in MSDN). But I get different results.When
$(CAD_Year)
is 2015, I expect theAcRibbon
will be not referensed to my project:<ItemGroup Condition= "'$(CAD_Year)' < '2010'" > <Reference Include="AcRibbon"> <HintPath>$(CAD_SDK_Location)\$(Inc)\AcRibbon.dll</HintPath> <Private>False</Private> </Reference> </ItemGroup>
But I get unresolved reference in the Solution Browser for the
AcRibbon
always.But this variant works fine:
<Choose> <When Condition= "'$(CAD_Year)' < '2010'"> <ItemGroup> <Reference Include="AcRibbon"> <HintPath>$(CAD_SDK_Location)\$(Inc)\AcRibbon.dll</HintPath> <Private>False</Private> </Reference> </ItemGroup> </When> </Choose>
At this case the
AcRibbon
is referenced only when$(CAD_Year)
less than 2010. Why I get the different results?-
Nikerboker about 9 yearsIs the ItemGroup in the 1st sample global (defined outside any target)? If so, a possible reason is condition evaluation order. Condition of a global ItemGroup is calculated before any target run. Condition of a local ItemGroup is calculated at parent target run. Global properties are calculated before any ItemGroups and targets.
-
CAD bloke about 9 yearsAre you sure it doesn't work? Visual Studio is not very good at displaying conditional references when you change build configurations, especially if the different build configurations reference things with the same name. The only way to test if it actually works or not is to build it. Sometimes you will get a cross on the Solution Explorer on the dodgy reference - it is safe to leave it alone.
-
Andrey Bushman about 9 yearsYes, I am sure. This code is located in my external
props
-file. I import its content into mycsproj
-file through theImport
xml element. -
stijn about 9 yearsunresolved reference in the Solution Browser that is not exactly relevant as CAD bloke says; does your project build? The code shown works fine. If you add a target which displays @(Reference) then you'll see Reference is empty when CAD_Year is 2015, and contains AcRibbon twice when CAD_Year is e.g. 2008.
-
SteveCinq about 2 years@CADbloke I agree; the
ItemGroup
Condition does appear to work (VS2019) but the IDE doesn't reflect this if you change build Configuration from Debug to Release, for example. But building either build does result in the correct behaviour in my (recent) experience.
-
-
Codor over 8 yearsVery useful answer. I find it a bit strange that many of the possibilities of MSBuild are not accessible within the IDE.
-
C.J. almost 6 yearsNote: This does not work in Visual Studio for Mac (version 7.5.3)