2009-09-03 9 views
11

¿Cómo puedo mantener los valores definidos en un objetivo de construcción activo en otro objetivo? Si PropertyGroup no es la entidad de escritura de MsBuild que debería usar aquí, ¿qué es? ReleaseDir se imprime bien en el objetivo de "paquete", pero está vacío en "DoPackage"Pasar el valor del grupo de propiedades de una tarea de MsBuild a otra

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

Respuesta

21

Hay una well known issue con propiedades y la tarea CallTarget. Deberías usar DependsOnTargets en su lugar.

<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

Me gustaría que DoPackage se ejecute solo si ReleaseDir existe (utilicé la condición en CallTarget para lograr esto). ¿Puedo lograr esto usando DependsOnTarget? – ripper234

+0

Ahora que realmente leí el enlace que publiqué, la solución es simple: escribí una tarea separada llamada 'DefineProperties', y una vez terminada las propiedades están ... definidas. Gracias. – ripper234

+0

Sí, esa es la solución, he actualizado la muestra. –

1

Si se desea pasar una propiedad a un objetivo, la tarea MSBuild puede ser útil. Esta es la única forma de llamar a un objetivo varias veces con diferentes valores de propiedad, pero no permite pasar elementos o grupos de elementos. Vea esto comment en el hilo con el que Julien se vincula.

... [C] todos los MSBuild apuntan de nuevo, esta vez pasando las propiedades requeridas. Esto pasa por alto la creación incremental ..., pero tiene muchas limitaciones, es decir, no puede pasar elementos y debe especificar qué propiedades se deben aprobar.

Esto es lo que el fragmento de código se vería así mediante la tarea de MSBuild:

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

Esta técnica es útil si se desea utilizar el destino como una subrutina, que se puede llamar varias veces con diferentes valores paramétricos. Por ejemplo, para llamar a un proceso de compilación para varias configuraciones de producto.

1

Puede que no sea la manera más limpia para solucionar este problema, pero si alguien todavía quiere utilizar CallTarget en el archivo de creación, él/ella debe definir el PropertyGroup en otro destino, la siguiente es la solución a este extraño problema.

+0

Si 'DeugBuild' actualiza el valor de' Configuration', ' CompileSolution' todavía no usará el nuevo valor. – makhdumi

+0

@ Al-Muhandis En realidad sí, no sé por qué, pero si define la propiedad en el destino de dependencia, todos los demás destinos a los que llame usando CallTarget tendrán el valor. Inténtalo tú mismo –

Cuestiones relacionadas