2009-09-02 11 views
14

quiero declarar tres propiedades en mi archivo de MSBuild y sobrescribir una propiedad con el valor de otra (en función del objetivo que se llama), pero no puede encontrar la manera de hacer esto. Mi fichero de construcción se ve algo como esto:propiedades de sobrescritura con MSBuild

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

En este momento estoy tratando de volver a declarar la propiedad que establezca su valor en consecuencia, pero esto no está funcionando.

Respuesta

13

Mehmet tiene razón acerca de cómo establecer un valor de propiedad de otra propiedad, pero hay un error/característica de MSBuild que significa que si llama CreateProperty y CallTarget en el mismo destino, su nueva propiedad no lo hará estar disponible globalmente para otros objetivos (described here).

Así que aquí es la solución definitiva al problema:

<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

Gracias, eso fue útil. Todavía soy un poco nuevo en el procesamiento por lotes y MS no hace un buen trabajo explicando conceptos relacionados en mi opinión. Una nota más En realidad escapé sin crear una propiedad global; eso reduce un poco el contexto, por lo que es más fácil leer el código: el destino A llama a los destinos B y C. B establece una propiedad de lista y C realiza el procesamiento por lotes del valor de esa propiedad. como notó mdresser establecer la propiedad en el mismo destino no funcionó. Espero que ayude a alguien; Pasé 3-4 horas tratando de entender esto antes de encontrar esta publicación. – AlexeiOst

+0

Un punto más, dices que recibes una notificación de que solo Cat ha cambiado, ¿has intentado guardar los cambios? ¿Funciona? (Lo dudo) –

8

Puede utilizar CreateProperty tarea para sobrescribir el valor de una propiedad existente.

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

Esto no parece funcionar para mí. Puedo usar el valor de la propiedad DeployPath inmediatamente después del bloque CreateProperty, pero pierde su valor dentro del destino Deploy-Sub. –

+2

Haa, acaba de encontrar este artículo http://weblogs.asp.net/bhouse/archive/2006/03/20/440648.aspx que describe un error/función con la tarea CreateProperty. –

+0

Interesante No sabía acerca de este error. Utilicé CreateProperty antes, pero aparentemente no se necesitó nada para acceder a la propiedad sobreescrita fuera del objetivo que la sobrescribió. Gracias. –

4

normalmente evito la tarea CallTarget. Mucho mejor es usar dependencias de destino.

+0

¿Podría elaborar un poco? ¿Por qué es mejor para ti? –

+2

@HaymoKutschbach debido a este error http://sedodream.com/PermaLink,guid,dd6cb1db-c0e4-47f7-ad84-6e59ff6b03d0.aspx y creo que CallTarget va en contra del modelo mental de cómo debe usarse msbuild. MSBuild es declarativo, CallTarget es muy imperativo. Dicho esto, hay algunos casos cuando es necesario, pero deberías preferir DependsOn antes de CallTarget. –

+0

Gracias! Estoy de acuerdo y parece que el equipo de msbuild alienta a DependsOn también para permitir que las propiedades se establezcan globalmente en proyectos importados. –

0

Además, puede utilizar siguiente manera:

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