2010-11-04 8 views
13

eseguire questo con msbuild:Come posso interrompere il batch di articoli dall'esecuzione di un batch quando ci sono zero elementi?

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Main" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <ItemGroup> 
    <Colors Include="Blue"> 
     <Shade>Dark</Shade> 
    </Colors> 
    </ItemGroup> 

    <Target Name="Main"> 
    <Message Text="Color: %(Colors.Shade) %(Colors.Identity)"/> 
    </Target> 

</Project> 

Ed uscite:

Color: Dark Blue 

Tutto bene, e buono, ma eliminare il colore e utilizzare questo:

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Main" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <ItemGroup> 
    </ItemGroup> 

    <Target Name="Main"> 
    <Message Text="Color: %(Colors.Shade) %(Colors.Identity)"/> 
    </Target> 

</Project> 

E USCITE:

Color: 

Perché un batch dell'attività del messaggio viene eseguito quando non ci sono elementi nel gruppo? Mi sarei aspettato per zero elementi, il batch avrebbe eseguito zero volte e non avrei visto "Colore:" seguito da nulla nell'output.

Sto facendo qualcosa di sbagliato o c'è una soluzione per questo?

Grazie.


Aggiornamento: ho trovato che si può fare:

<Message Condition="'@(Colors)'!=''" Text="Color: %(Colors.Shade) %(Colors.Identity)"/> 

Ma, se si sente insoddisfacente dover scrivere il codice in modo esplicito per il caso in cui non vi sono elementi ogni volta che il dosaggio viene utilizzato.

+0

Una domanda ben posta. +1 –

risposta

11

I miei 2 centesimi:

In un Messaggio Task, ci sono informazioni da dosaggio e informazioni statiche ("Colori:"). Penso che MsBuild stampi le informazioni statiche e quindi esegua il batch sui valori del tuo oggetto Colors. Il problema è che non hai nessun dato nella tua collezione (è anche non dichiarato), suppongo che MsBuild lo interpreti come una lista vuota, che, quando provi a stamparla, stampa la stringa vuota ''.

Se si rimuove il contenuto statico ("Colori:" e lo spazio vuoto prima dell'identità), non verrà visualizzato nulla.

Una soluzione per la stampa con il dosaggio solo se gli elementi di raccolta non è vuoto sarebbe o:

  1. Verificare se la raccolta è vuota

    <Message Condition="'@(Colors)'!=''" Text="Color: %(Colors.Shade) %(Colors.Identity)"/> 
    
  2. Usa Transform [1]

    <Message Text="@(Colors->'Color : %(Shade) %(Identity)')"/> 
    

[1] http://msdn.microsoft.com/en-us/library/ms171476.aspx

+0

Grazie, questa è un'informazione utile. Sì, se rimuovo il bit statico "Colori:", allora funziona bene. In realtà sto usando questo in un compito di Exec per chiamare uno strumento da riga di comando per un gruppo di file. Questo richiede un po 'di contenuto statico affinché gli argomenti passino allo strumento della riga di comando, quindi sì, come dici tu, mi sembra di dover fare molta attenzione ad includere Condition = "' (@ Colors) '! =' '" In tutto i luoghi in cui utilizzo questa tecnica. –

4

Volevo solo aggiungere una soluzione alternativa anche a questo. Se è possibile modificare il batching in batch di destinazione, anziché in batch di attività, è possibile aggiungere la dichiarazione di condizione alla destinazione.

ho aggiunto il dosaggio target qui:

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Main" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <ItemGroup> 
    </ItemGroup> 

    <Target Name="Main" Outputs="%(Colors.Identity)"> 
    <Message Text="Color: %(Colors.Shade) %(Colors.Identity)"/> 
    </Target> 

</Project> 

...e che può essere fatto condizionalmente per eseguire solo quando qualcosa esiste nel gruppo di articoli Colori:

<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Main" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 

    <ItemGroup> 
    </ItemGroup> 

    <Target Condition="'@(Colors)'!=''" Name="Main" Outputs="%(Colors.Identity)"> 
    <Message Text="Color: %(Colors.Shade) %(Colors.Identity)"/> 
    </Target> 

</Project> 
Problemi correlati