2010-10-22 16 views
10

E 'possibile creare proprietà utilizzando uno dei seguenti metodi:In MsBuild, qual è la differenza tra CreateProperty vs PropertyGroup?

<Target Name="A"> 
    <PropertyGroup> 
     <DogSound>Bark</DogSound> 
    </PropertyGroup> 
</Target> 

<Target Name="B"> 
    <CreateProperty Value="Bark"> 
     <Output TaskParameter="Value" PropertyName="DogSound"/> 
    </CreateProperty> 
</Target> 

Ma, qual è la differenza tra la semantica dei bersagli A e B, se qualcosa?

Grazie.


Nota: sto utilizzando msbuild 3.5. Credo che la sintassi PropertyGroup non abbia funzionato all'interno di una destinazione nelle versioni precedenti di msbuild, ma era lo stesso anche con gli ItemGroup. CreateItem è stato deprecato, ma CreateProperty no, quindi mi chiedo se CreateProperty abbia ancora qualcosa sull'utilizzo di PropertyGroup e, in tal caso, cosa.

+2

Un problema che ho incontrato usando all'interno dei target è che non sono supportati in Mono: http://www.mono-project.com/Microsoft.Build Apparently CreateProperty funziona bene ... –

risposta

7

Non utilizzare CreateProperty & CreateItem in MSBuild 4.0. Invece basta posizionare ItemGroup e PropertyGroup direttamente all'interno della destinazione.

Si è corretto prima che MSBuild 3.5 ItemGroup/PropertyGroup non fosse consentito all'interno di destinazioni, quindi c'era CreateProperty & Attività CreateItem che le persone avrebbero utilizzato. Dopo MSBuild 3.5 dovresti semplicemente usare il gruppo di proprietà ItemGroup &. Sebbene ci siano alcuni casi estremi in cui è ancora necessario creare CreateProperty & CreateItem, ma non mi preoccuperei di quelli. Questi scenari riguardano l'escaping e il modo in cui CreateItem è meno restrittivo di ItemGroup. Ma in realtà il 99% delle persone non lo affronterà.

+0

Grazie per la tua risposta, cercherò di aderire a PropertyGroup. Tuttavia, stavo davvero chiedendo l'1% della differenza che le persone dovranno affrontare. Quali sono i casi d'angolo in cui PropertyGroup non funziona e CreateProperty è necessario? –

+0

@ScottLangham un esempio sarebbe la creazione di proprietà accessibili da altri target ([vedi questo post] (http://stackoverflow.com/questions/1366840/overwrite-properties-with-msbuild)) –

+1

L'unica volta che vorrei usare 'CreateItem' o' CreateProperty' è se il nuovo nome è noto solo al runtime. – Eris

0

Non c'è differenza tra il comportamento di questi due obiettivi. Anche se si aggiunge un'attività CallTarget alla fine di entrambi: $(DogSound) non verrà valutata "Bark" nell'obiettivo chiamato!

Tuttavia, ci sarà una differenza se si effettua una delle seguenti modifiche al bersaglio B. Né è possibile utilizzare PropertyGroup.

  • Aggiungere Input e Output attributi all'elemento Target e cambiare TaskParameter="Value" a TaskParameter="ValueSetByTask". Quest'ultima modifica sarebbe preventDogSound da impostare su "Bark" quando il target B viene saltato a causa delle sue uscite aggiornate rispetto ai suoi input.
  • Modificare "DogSound" (il nome della proprietà) su un valore dinamico.

(Anche se CreateItem contro ItemGroup non è parte della questione, mi rivolgo perché la risposta è semplice. A differenza di CreateProperty, CreateItem è stato deprecato, in modo da utilizzare un in-bersaglio ItemGroup è l'unica scelta.)

Problemi correlati