2009-09-03 3 views
11

Comment conserver les valeurs définies dans une cible de génération active dans un autre targert? Si PropertyGroup n'est pas l'entité d'écriture MsBuild que je devrais utiliser ici, qu'est-ce que c'est? RELEASEDIR est imprimé ok dans la cible « Package », mais il est vide « DoPackage »Transmission d'une valeur de groupe de propriétés d'une tâche MsBuild à une autre

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

Répondre

21

Il y a un well known issue avec des propriétés et la tâche CallTarget. Vous devriez utiliser DependsOnTargets à la place.

<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

Je voudrais que DoPackage s'exécute seulement si ReleaseDir existe (j'ai utilisé la Condition dans CallTarget pour réaliser ceci). Puis-je y parvenir en utilisant DependsOnTarget? – ripper234

+0

Maintenant que j'ai lu le lien que vous avez posté, la solution est simple - j'ai écrit une tâche distincte appelée 'DefineProperties', et une fois terminée, les propriétés sont ... définies. Merci. – ripper234

+0

Oui, c'est la solution, j'ai mis à jour l'échantillon. –

1

Si vous souhaitez transmettre une propriété à une cible, la tâche MSBuild peut être utile. C'est le seul moyen d'appeler une cible plusieurs fois avec des valeurs de propriété différentes, mais elle n'autorise pas la transmission d'éléments ou de groupes d'éléments. Voir ce comment dans le fil auquel Julien est lié.

... [C] tous les MSBuild cible à nouveau, en passant cette fois dans les propriétés requises. Cela contourne la construction incrémentielle ..., mais a de nombreuses limitations, à savoir que vous ne pouvez pas passer des éléments et vous devez spécifier les propriétés qui doivent être transmises.

Voici ce que l'extrait de code ressemblerait à la tâche 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> 

Cette technique est utile si vous souhaitez utiliser la cible comme un sous-programme, que vous pouvez appeler plusieurs fois avec différents valeurs de paramètre. Par exemple, pour appeler un processus de construction pour plusieurs configurations de produits.

1

Il pourrait ne pas être le plus propre moyen de résoudre ce problème, mais si quelqu'un veut encore utiliser CallTarget sur le fichier de construction, il/elle doit définir la PropertyGroup dans une autre cible, ce qui suit est la solution à ce problème étrange.

<Target Name="DebugBuild" DependsOnTargets="DebugBuildProp"> 
    <CallTarget Targets="CompileSolution"/> 
</Target> 
<Target Name="DebugBuildProp"> 
    <PropertyGroup> 
    <Configuration>Debug</Configuration> 
    </PropertyGroup> 
</Target> 
<Target Name="CompileSolution"> 
    <Message Text="$(Configuration)" /> 
</Target> 
+0

Si 'DeugBuild' met à jour la valeur de' Configuration', ' CompileSolution' n'utilisera toujours pas la nouvelle valeur. – makhdumi

+0

@ Al-Muhandis En fait, je ne sais pas pourquoi mais si vous définissez la propriété sur la cible de dépendance, toutes les autres cibles que vous appelez en utilisant CallTarget auront la valeur. Essayez-le vous-même –

Questions connexes