2009-09-02 15 views
14

Ich möchte drei Eigenschaften in meiner MSBuild-Datei deklarieren und eine Eigenschaft mit dem Wert eines anderen überschreiben (abhängig von dem Ziel, das aufgerufen wird), kann aber nicht herausfinden, wie das geht. Meine Build-Datei sieht in etwa wie folgt aus:Eigenschaften mit MSBuild überschreiben

<PropertyGroup> 
    <DeployPath_TEST>\\test-server-path\websites\mysite</DeployPath_TEST> 
    <DeployPath_LIVE>\\live-server-path\websites\mysite</DeployPath_LIVE> 
    <DeployPath></DeployPath> 
</PropertyGroup> 

<Target Name="Deploy-TEST"> 
    <PropertyGroup> 
     <DeployPath>$(DeployPath_TEST)</DeployPath> 
    </PropertyGroup> 
    <CallTarget Targets="Deploy-Sub"/> 
</Target> 

<Target Name="Deploy-LIVE"> 
    <PropertyGroup> 
     <DeployPath>$(DeployPath_TEST)</DeployPath> 
    </PropertyGroup> 
    <CallTarget Targets="Deploy-Sub"/> 
</Target> 

<Target Name="Deploy-Sub"> 
    <Message Text="Deploying to $(DeployPath)"/> 
    <MSBuild Projects="MySolution.csproj" Targets="Rebuild" /> 

    <ItemGroup> 
    <MyFiles Include="**\*"/> 
    </ItemGroup> 

    <Copy SourceFiles="@(MyFiles)" 
     DestinationFiles="@(MyFiles->'$(DeploymentPath)\%(RecursiveDir)%(FileName)%(Extension)')"/> 

</Target> 

Im Moment versuche ich die Eigenschaft neu zu deklarieren Einstellung es Wert ist entsprechend, aber das funktioniert nicht.

Antwort

13

Mehmet ist richtig, wie ein Eigenschaftswert von einer anderen Eigenschaft zu setzen, aber es gibt einen Bug/Feature in MSBuild, die die bedeutet, wenn Sie Create und CallTarget in dem gleichen Ziel nennen, Ihre neue Immobilie wird nicht global für andere Ziele verfügbar sein (described here).

So, hier ist die endgültige Lösung für das Problem:

<PropertyGroup> 
    <DeployPath_TEST>\\test-server-path\websites\mysite</DeployPath_TEST> 
    <DeployPath_LIVE>\\live-server-path\websites\mysite</DeployPath_LIVE> 
    <DeployPath></DeployPath> 
</PropertyGroup> 

<Target Name="SetDeployPath-TEST"> 
    <CreateProperty Value="$(DeployPath_TEST)"> 
    <Output TaskParameter="Value" PropertyName="DeployPath"/> 
    </CreateProperty> 
</Target> 

<Target Name="Deploy-TEST"> 
    <CallTarget Targets="SetDeployPath-TEST"/> 
    <CallTarget Targets="Deploy-Sub"/> 
</Target> 

<Target Name="Deploy-Sub"> 
    <Message Text="Deploying to $(DeployPath)"/> 
    <MSBuild Projects="MySolution.csproj" Targets="Rebuild" /> 

    <ItemGroup> 
    <MyFiles Include="**\*"/> 
    </ItemGroup> 

    <Copy SourceFiles="@(MyFiles)" 
    DestinationFiles="@(MyFiles->'$(DeploymentPath)\%(RecursiveDir)%(FileName)%(Extension)')"/> 

</Target> 
+0

Danke, das war nützlich. Ich bin immer noch etwas neu im Batching und MS macht keine gute Arbeit, um verwandte Konzepte meiner Meinung nach zu erklären. Noch eine Anmerkung. Ich kam tatsächlich ohne ein globales Eigentum zu schaffen; Das verengt den Kontext ein wenig, so dass es einfacher ist, den Code zu lesen: Ziel A ruft Ziele B und C auf. B legt eine Listeneigenschaft fest und C führt eine Stapelverarbeitung für den Wert dieser Eigenschaft durch. als Fräulein notierte Einstellung der Eigenschaft in das gleiche Ziel hat nicht funktioniert. Hoffe es hilft jemandem; Ich habe 3-4 Stunden damit verbracht, dies zu verstehen, bevor ich diesen Beitrag gefunden habe. – AlexeiOst

+0

Noch ein Punkt, Sie sagen, Sie erhalten eine Benachrichtigung, dass nur Cat geändert hat, haben Sie versucht, die Änderungen zu speichern? Funktioniert es? (Ich bezweifle es) –

8

Sie können die Aufgabe CreateProperty verwenden, um den Wert einer vorhandenen Eigenschaft zu überschreiben.

<Target Name="Deploy-LIVE"> 
    <CreateProperty Value="$(DeployPath_LIVE)"> 
    <Output PropertyName="DeployPath" TaskParameter="Value"/> 
    </CreateProperty> 
    <CallTarget Targets="Deploy-Sub"/> 
</Target> 
+0

Dies scheint nicht für mich zu arbeiten. Ich kann den Wert der DeployPath-Eigenschaft direkt nach dem CreateProperty-Block verwenden, verliert jedoch seinen Wert innerhalb des Deploy-Sub-Ziels. –

+2

Haa, fand gerade diesen Artikel http://weblogs.asp.net/bhouse/archive/2006/03/20/440648.aspx einen Fehler/eine Eigenschaft mit der Aufgabe CreateProperty zu beschreiben. –

+0

Interessant Ich wusste nicht über diesen Fehler. Ich habe CreateProperty vorher benutzt, aber anscheinend brauchte ich nichts, um auf die überschriebene Eigenschaft außerhalb des Ziels zuzugreifen, das sie überschrieben hat. Vielen Dank. –

4

ich die Regel vermeiden CallTarget Aufgabe. Viel besser ist es, Zielabhängigkeiten zu verwenden.

+0

Könnten Sie ein wenig ausarbeiten? Warum ist es besser für dich? –

+2

@HaymoKutschbach wegen dieses Fehlers http://sedodream.com/PermaLink,guid,dd6cb1db-c0e4-47f7-ad84-6e59ff6b03d0.aspx und ich denke, CallTarget geht gegen das mentale Modell, wie Msbuild verwendet werden sollte. MSBuild ist deklarativ, CallTarget ist sehr wichtig. Mit dem gesagt, es gibt einige Fälle, wenn es benötigt wird, aber Sie sollten DependsOn vor CallTarget bevorzugen. –

+0

Danke! Ich stimme dem zu und es scheint, dass das msbuild-Team DependsOn dazu ermutigt, Eigenschaften global in importierten Projekten zu setzen. –

0

Außerdem können Sie wie folgt verwenden:

<PropertyGroup> 
    <DeployPath_TEST>\\test-server-path\websites\mysite</DeployPath_TEST> 
    <DeployPath_LIVE>\\live-server-path\websites\mysite</DeployPath_LIVE> 
    <DeployPath></DeployPath> 
</PropertyGroup> 

<Target Name="SetDeployPath-TEST"> 
    <CreateProperty Value="$(DeployPath_TEST)"> 
    <Output TaskParameter="Value" PropertyName="DeployPath"/> 
    </CreateProperty> 
</Target> 

<Target Name="Deploy-Sub" DependsOnTargets="SetDeployPath-TEST"> 
    <Message Text="Deploying to $(DeployPath)"/> 
    <MSBuild Projects="MySolution.csproj" Targets="Rebuild" /> 

    <ItemGroup> 
    <MyFiles Include="**\*"/> 
    </ItemGroup> 

    <Copy SourceFiles="@(MyFiles)" 
    DestinationFiles="@(MyFiles->'$(DeploymentPath)\%(RecursiveDir)%(FileName)%(Extension)')"/> 

</Target> 
Verwandte Themen