2015-03-04 5 views
8

MS Visual Studio 2013Warum funktioniert das Attribut `Condition` nicht für das Element` ItemGroup`?

Sowohl When und ItemGroup Elemente können das Condition Attribut haben (wie ich in MSDN). Aber ich bekomme andere Ergebnisse.

Wenn $(CAD_Year) ist 2015 erwarte ich, dass die AcRibbon wird nicht mein Projekt referensed:

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

Aber ich habe nicht aufgelösten Verweis im Solution Browser für die AcRibbon immer.

Aber diese Variante funktioniert:

<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> 
In diesem Fall

die AcRibbon wird nur referenziert, wenn $(CAD_Year) weniger als 2010. Warum ich die verschiedenen Ergebnisse zu erzielen?

+0

die ItemGroup in der ersten Probe global ist (außerhalb jedes Ziel definiert ist)? Wenn dies der Fall ist, ist ein möglicher Grund die Bedingungsevaluierungsreihenfolge. Die Bedingung einer globalen ItemGroup wird vor jedem Ziellauf berechnet. Die Bedingung einer lokalen ItemGroup wird beim übergeordneten Ziellauf berechnet. Globale Eigenschaften werden vor allen ItemGroups und Zielen berechnet. – Nikerboker

+0

Beide sind global. –

+0

Sind Sie sicher, dass es nicht funktioniert? Visual Studio ist nicht sehr gut darin, bedingte Referenzen anzuzeigen, wenn Sie Build-Konfigurationen ändern, insbesondere wenn die verschiedenen Build-Konfigurationen auf Objekte mit demselben Namen verweisen. Der einzige Weg zu testen, ob es tatsächlich funktioniert oder nicht, ist es zu bauen. Manchmal erhalten Sie im Solution Explorer auf der zwielichtigen Referenz ein Kreuz - es ist sicher, es in Ruhe zu lassen. –

Antwort

14

fand ich die Antwort in MSDN here:

Während bedingten Import-Anweisungen arbeiten in Befehlszeilen MSBuilds, sie Entwicklungsumgebung in Visual Studio mit MSBuild arbeiten (IDE) integriert sind. Bedingte Importe werden von mithilfe der Konfigurations- und Plattformwerte ausgewertet, die beim Laden des Projekts festgelegt werden. Wenn anschließend Änderungen vorgenommen werden, die eine Neubewertung der Bedingungen in der Projektdatei erfordern, z. B. die Plattform ändern, überprüft Visual Studio die Bedingungen für Eigenschaften und Elemente, nicht jedoch für Importe. Da der Import-Status nicht neu ausgewertet wird, wird der Import übersprungen. Um dies zu umgehen, setzen Sie bedingte Importe in die .targets-Dateien oder setzen Sie den Code in einen bedingten Block, z. B. einen Choose-Element-Block (MSBuild).

Ich denke, das auch für ItemGroup Element wahr ist ...

+0

Sehr nützliche Antwort. Ich finde es etwas merkwürdig, dass viele der Möglichkeiten von MSBuild nicht innerhalb der IDE zugänglich sind. – Codor

Verwandte Themen