2009-10-01 18 views
57

Sto provando a creare un obiettivo riutilizzabile nel mio file MSBuild, così posso chiamarlo più volte con parametri diversi.MSBuild che passa i parametri a CallTarget

io ho uno scheletro come questo:

<Target Name="Deploy"> 
    <!-- Deploy to a different location depending on parameters --> 
</Target> 

<Target Name="DoDeployments"> 
    <CallTarget Targets="Deploy"> 
     <!-- Somehow indicate I want to deploy to dev --> 
    </CallTarget> 

    <CallTarget Targets="Deploy"> 
     <!-- Somehow indicate I want to deploy to testing --> 
    </CallTarget> 
</Target> 

ma non riesco a capire come consentire i parametri da passare nella CallTarget, e poi a sua volta il Target stesso.

risposta

69

Gli obiettivi di MSBuild non sono progettati per ricevere parametri. Invece, usano le proprietà che definisci per loro.

<PropertyGroup> 
    <Environment>myValue</Environment> 
</PropertyGroup> 

<Target Name="Deploy"> 
    <!-- Use the Environment property --> 
</Target> 

Tuttavia, uno scenario comune è quello di invocare un bersaglio più volte con diversi parametri (vale a dire Deploy diversi siti web). In quel caso, io uso il compito MSBuild MSBuild e inviare i parametri come Proprietà:

<Target Name="DoDeployments"> 
    <MSBuild Projects ="$(MSBuildProjectFullPath)" 
      Properties="VDir=MyWebsite;Path=C:\MyWebsite;Environment=$(Environment)" 
      Targets="Deploy" /> 

    <MSBuild Projects ="$(MSBuildProjectFullPath)" 
      Properties="VDir=MyWebsite2;Path=C:\MyWebsite2;Environment=$(Environment)" 
      Targets="Deploy" /> 
</Target> 

$(MSBuildProjectFullPath) è la fullpath dello script MSBuild corrente nel caso in cui non si desidera inviare "Distribuire" per un altro file.

Spero che questo aiuti!

1

Potrebbe esserci un modo migliore per farlo in MSBuild, ma in Ant userei le proprietà globali per trasferire informazioni da un'attività all'altra. Era una pessima soluzione, ma al momento non vedevo un modo migliore. Dovresti essere in grado di farlo in MSBuild, ma tieni presente che dovrai utilizzare l'attività CreateProperty per assegnare dinamicamente una proprietà.

D'altra parte, è abbastanza semplice implementare attività in C# (o VB o qualsiasi altra cosa). Forse è una soluzione migliore per te.

1
<CreateProperty 
     Value="file1"> 
     <Output 
      TaskParameter="Value" 
      PropertyName="filename" /> 
    </CreateProperty> 
    <CallTarget Targets="Deploy"/> 
    <Message Text="$(filename)"/> 
    <CreateProperty 
     Value="file2"> 
     <Output 
      TaskParameter="Value" 
      PropertyName="filename" /> 
    </CreateProperty> 
    <Message Text="$(filename)"/> 
    <CallTarget Targets="Deploy"/> 
+2

CreateProperty è stato rimosso in V4. Utilizzare PropertyGroup all'interno di una destinazione. Rif: http://msdn.microsoft.com/en-us/library/ms171458.aspx – WooWaaBob

17

si puo 'foreach' su un ItemGroup con un target, solo che hanno a che fare in maniera declaritive. Si può anche avere altri metadati in oggetti, come nell'esempio di codice:

<ItemGroup> 
    <What Include="Dev"> 
     <How>With bugs</How> 
    </What> 
    <What Include="Test"> 
     <How>With tests</How> 
    </What> 
    <What Include="Chicken"> 
     <How>Deep fried</How> 
    </What> 
</ItemGroup> 

<Target Name="Deploy"> 
    <Message Text="@(What), %(How)" /> 
</Target> 

Utilizzando un gruppo di articoli come un valore scalare @(What) all'interno di un bersaglio fa il trucco, e %(How) riferimenti un elemento di metadati in un elemento foreach.

È un modo naturale di fare le cose in msbuild, ad esempio è possibile trovare questo pattern ovunque nei file di progetto generati con Visual Studio.

Problemi correlati