2009-10-01 10 views
57

Ich versuche, ein wiederverwendbares Ziel in meiner MSBuild-Datei zu machen, so dass ich es mehrmals mit verschiedenen Parametern aufrufen kann.MSBuild Weitergabe von Parametern an CallTarget

Ich habe ein Skelett wie diese bekommen:

<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> 

Aber ich kann nicht herausfinden, wie Parameter, damit die Target sich wiederum in die CallTarget, und dann übergeben werden.

Antwort

69

MSBuild-Ziele sind nicht für den Empfang von Parametern ausgelegt. Stattdessen verwenden sie die Eigenschaften, die Sie für sie definieren.

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

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

jedoch ein gängiges Szenario ist ein Ziel mehrmals mit unterschiedlichen Parametern (d Bereitstellen von mehreren Websites) aufzurufen. In diesem Fall verwende ich die Aufgabe MSBuild MSBuild und die Parameter als Eigenschaften an:

<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) die fullpath des aktuellen MSBuild-Skript für den Fall ist, dass Sie nicht wollen, „Bereitstellen“ auf eine andere Datei senden.

Hoffe, das hilft!

1

Möglicherweise gibt es eine bessere Möglichkeit, dies in MSBuild zu tun, aber in Ant würde ich globale Eigenschaften verwenden, um Informationen von einer Aufgabe zur nächsten zu tragen. Es war eine lausige Lösung, aber zu der Zeit sah ich keinen besseren Weg. Sie sollten dies in MSBuild tun können, aber beachten Sie, dass Sie die Aufgabe CreateProperty verwenden müssen, um eine Eigenschaft dynamisch zuzuweisen.

Auf der anderen Seite ist es ziemlich einfach, Aufgaben in C# (oder VB oder was auch immer) zu implementieren. Vielleicht ist das eine bessere Lösung für Sie.

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 wurde in V4 entzogen. Verwenden Sie stattdessen PropertyGroup in einem Ziel. Ref: http://msdn.microsoft.com/en-us/library/ms171458.aspx – WooWaaBob

17

Sie können ‚foreach‘ über einen ItemGroup mit einem Ziel, nur muss man es in declaritive Weise tun. Sie können sogar zusätzliche Metadaten in Einzelteile haben, wie im Codebeispiel:

<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> 

eine Artikelgruppe als Skalarwert @(What) innerhalb eines Ziel Mit der Trick funktioniert, und %(How) Referenzen ein Metadatenelement in einer foreach-Element.

Es ist ein natürlicher Weg, Dinge in Msbuild zu tun, zum Beispiel können Sie dieses Muster überall in Projektdateien finden, die mit Visual Studio generiert wurden.

Verwandte Themen