2009-09-03 5 views
11

Wie behalte ich die in einem Build-Ziel definierten Werte in anderen Bereichen? Wenn PropertyGroup nicht die Schreib-MsBuild-Entität ist, die ich hier verwenden soll, was ist das? RELEASEDIR gedruckt ok in "Package" Ziel, aber leer in "DoPackage"Übergeben von Eigenschaftsgruppenwerten von einer MsBuild-Aufgabe an eine andere

<Target Name="Package"> 
    <PropertyGroup> 
    <ReleasesDir>c:\tmp</ReleasesDirBase> 
    </PropertyGroup> 
    <Message Text="$(ReleaseDir)"/> 
    <CallTarget Targets="DoPackage" Condition="!Exists('$(ReleaseDir)')"/> 
</Target> 

<!-- Do the acutal packaging --> 
<Target Name="DoPackage"> 
    <Message Text="Creating package in '$(ReleaseDir)'"/> 
    <Error Condition="'$(ReleaseDir)' == ''" Text="No ReleaseDir defined"/> 
    <MakeDir Directories="$(ReleaseDir)"/> 
    ... 
</Target> 

Antwort

21

Es gibt eine well known issue mit Eigenschaften und der CallTarget Aufgabe. Sie sollten stattdessen DependsOnTargets verwenden.

<Target Name="Package"> 
    <PropertyGroup> 
    <ReleasesDir>c:\tmp</ReleasesDir> 
    </PropertyGroup> 
    <Message Text="$(ReleasesDir)"/> 
</Target> 

<Target Name="PrePackage" DependsOnTargets="Package"> 
    <CallTarget Targets="DoPackage" Condition="!Exists('$(ReleasesDir)')"/> 
</Target> 

<!-- Do the actual packaging --> 
<Target Name="DoPackage" DependsOnTargets="Package"> 
    <Message Text="Creating package in '$(ReleasesDir)'"/> 
    <Error Condition="'$(ReleasesDir)' == ''" Text="No ReleaseDir defined"/> 
    <MakeDir Directories="$(ReleasesDir)"/> 
</Target> 
+0

Ich möchte, dass DoPackage nur ausgeführt wird, wenn ReleaseDir vorhanden ist (ich habe die Bedingung in CallTarget verwendet, um dies zu erreichen). Kann ich dies mit DependsOnTarget erreichen? – ripper234

+0

Nun, da ich den Link gelesen habe, den Sie gepostet haben, ist die Lösung einfach - ich habe eine separate Aufgabe mit dem Namen 'DefineProperties' geschrieben, und nachdem sie fertig ist, werden die Eigenschaften ... definiert. Vielen Dank. – ripper234

+0

Ja, das ist die Lösung, ich habe das Sample aktualisiert. –

1

Wenn man eine Immobilie zu einem Ziel führen möchte, kann die MSBuild-Aufgabe nützlich sein. Dies ist die einzige Möglichkeit, ein Ziel mehrere Male mit unterschiedlichen Eigenschaftswerten aufzurufen. Es können jedoch keine Elemente oder Elementgruppen übergeben werden. Sehen Sie diese comment in dem Thread, den Julien verlinkt.

... [C] alle MSBuild Ziel erneut darauf, diesmal in den erforderlichen Eigenschaften. Dies umgeht inkrementelles Bauen ..., hat aber viele Einschränkungen, nämlich dass Sie keine Elemente übergeben können und Sie angeben müssen, welche Eigenschaften übergeben werden müssen. Hier

ist, was Ihr Code-Schnipsel wie mit dem MSBuild Aufgabe aussehen:

<Target Name="Package"> 
    <PropertyGroup> 
    <ReleasesDir>c:\tmp</ReleasesDir> 
    </PropertyGroup> 
    <Message Text="$(ReleaseDir)"/> 
    <MSBuild Projects="$(MSBuildProjectFile)" Targets="DoPackage" Properties="ReleaseDir=$(ReleaseDir)" /> 
</Target> 

<!-- Do the acutal packaging --> 
<Target Name="DoPackage"> 
    <Message Text="Creating package in '$(ReleaseDir)'"/> 
    <Error Condition="'$(ReleaseDir)' == ''" Text="No ReleaseDir defined"/> 
    <MakeDir Directories="$(ReleaseDir)"/> 
    ... 
</Target> 

Diese Technik ist nützlich, wenn Sie das Ziel als ein Unterprogramm verwenden möchten, die Sie mehrmals mit verschiedenen anrufen Parameterwerte. Zum Beispiel, um einen Build-Prozess für mehrere Produktkonfigurationen aufzurufen.

1

Es ist vielleicht nicht der sauberste Weg, dieses Problem zu lösen, aber wenn jemand will immer noch CallTarget auf der Build-Datei verwenden, kann er/sie die Property in einem anderen Ziel definieren müssen, ist die folgende die Lösung dieses Problems seltsames Problem.

+0

Wenn 'DeugBuild' den Wert von' Configuration', ' CompileSolution' verwendet den neuen Wert immer noch nicht. – makhdumi

+0

@ Al-Muhandis Es tut tatsächlich, ich weiß nicht warum, aber wenn Sie die Eigenschaft auf dem Abhängigkeitsziel definieren, würden alle anderen Ziele, die Sie CallTarget aufrufen, den Wert haben. Versuch es selber –