2010-07-16 11 views
6

Sono disperatamente curioso di non essere in grado di creare un elemento in un ambito globale basato su una condizione di metadati che funziona come previsto all'interno di una destinazione. Ad esempio, questo funziona come previsto:Perché MSBuild ItemGroup non funziona in un ambito globale

<ItemGroup> 
    <TestItems Include="TestItem1"> 
     <TestFlag>true</TestFlag> 
    </TestItems> 
    <TestItems Include="TestItem2"> 
     <TestFlag>false</TestFlag> 
    </TestItems> 
</ItemGroup> 

<Target Name="Default"> 

    <Message Text="@(TestItems)" /> 
    <Message Text="@(TestItems)" Condition="'%(TestItems.TestFlag)'=='true'" /> 

    <ItemGroup> 
     <FilteredTestItems Include="@(TestItems)" Condition="'%(TestItems.TestFlag)'=='true'" /> 
    </ItemGroup> 

    <Message Text="@(FilteredTestItems)" /> 
    <Message Text="@(FilteredTestItems)" Condition="'%(FilteredTestItems.TestFlag)'=='true'" /> 

</Target> 

e produce il seguente output:

TestItem1; TestItem2 TestItem1 TestItem1 TestItem1

E questo funziona come atteso:

<ItemGroup> 
    <TestItems Include="TestItem1"> 
     <TestFlag>true</TestFlag> 
    </TestItems> 
    <TestItems Include="TestItem2"> 
     <TestFlag>false</TestFlag> 
    </TestItems> 
</ItemGroup> 

<ItemGroup> 
    <FilteredTestItems Include="@(TestItems)" Condition="'false'=='true'" /> 
</ItemGroup> 

<Target Name="Default"> 

    <Message Text="@(TestItems)" /> 
    <Message Text="@(TestItems)" Condition="'%(TestItems.TestFlag)'=='true'" /> 


    <Message Text="@(FilteredTestItems)" /> 
    <Message Text="@(FilteredTestItems)" Condition="'%(FilteredTestItems.TestFlag)'=='true'" /> 

</Target> 

Produrre il seguente output:

TestItem1; TestItem2 TestItem1

Ma questo:

<ItemGroup> 
    <TestItems Include="TestItem1"> 
     <TestFlag>true</TestFlag> 
    </TestItems> 
    <TestItems Include="TestItem2"> 
     <TestFlag>false</TestFlag> 
    </TestItems> 
</ItemGroup> 

<ItemGroup> 
    <FilteredTestItems Include="@(TestItems)" Condition="'%(TestItems.TestFlag)'=='true'" /> 
</ItemGroup> 

produce il seguente errore MSBuild:

temp.proj (13,45) errore MSB4090 individuato un carattere non previsto '%' alla posizione 2 nella condizione "'% (TestItems.TestFlag) '==' vero '".

Quindi cosa dà? Certamente posso aggirarlo, ma cosa non sto esattamente comprendendo su ItemGroup, metadati e/o ambito globale?

risposta

4

La condizione del gruppo di articoli funziona al di fuori di un obiettivo, ma il batching non lo fa (è l'operatore "%"). Il batch viene utilizzato quando si chiama un'attività e, poiché è possibile chiamare un'attività solo da una destinazione, è consigliabile che il batch funzioni anche all'interno di una destinazione.

Si potrebbe chiedere perché il gruppo di articoli funziona all'interno della destinazione poiché non è un'attività. Prima di MSBuild 3.5, non ti erano consentiti affatto gruppi di articoli all'interno dei bersagli; dovevi chiamare lo CreateItem. Nelle versioni 3.5 e 4.0, l'utilizzo di gruppi di elementi in questo modo è consentito, ma penso che sia solo zucchero sintattico per chiamare l'attività CreateItem, quindi la condizione funziona perché è un'attività dietro le quinte.

+0

Certo, non è possibile utilizzare il batch all'esterno di un obiettivo. Penso che sia perché il parser legge solo l'ambito globale una volta (quindi non ha idea di cosa viene definito al suo interno quando analizza => nessun batch possibile). Per quanto riguarda la differenza tra ItemGroup e CreateItem puoi leggere questi argomenti: http://stackoverflow.com/questions/937681/createitem-vs-itemgroup e http://stackoverflow.com/questions/3891065/msbuild-itemgroup-include- exclude-pattern-issue –

+2

I documenti (ora?) dicono che ['CreateItem' è deprecato] (http://msdn.microsoft.com/en-us/library/s2y3e43x%28v=vs.90%29), quindi Eviterei di usarlo a meno che non sia necessario (penso che espanda i parametri in modo più aggressivo rispetto a "ItemGroup") perché, in un futuro molto lontano, forse non sarà incluso in .net ;-). Quindi, probabilmente non è "zucchero sintattico". – binki

Problemi correlati