12
votes

Passer la valeur du groupe de propriété d'une tâche Msbuild à une autre

Comment puis-je garder des valeurs définies dans une cible de construction vivante dans d'autres taglert? Si le groupe de propriété n'est pas l'entité msbuild écrit, je devrais utiliser ici, qu'est-ce qui est? Remetlevéir est imprimé OK dans la cible "Package", mais est vide dans "DOPACKAGE"

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


0 commentaires

3 Réponses :


21
votes

Il y a un Problème bien connu avec propriétés et tâche CallTarget. Vous devez 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>


4 commentaires

J'aimerais que DOPACKAGE ne fonctionne que si RemetSuméir existe (j'ai utilisé la condition dans CallTarget pour y parvenir). Puis-je atteindre cela en utilisant Dependsontarget?


Maintenant que je lis réellement le lien que vous avez posté, la solution est simple - j'ai écrit une tâche distincte appelée «DéfineProperties», et après sa finition, les propriétés sont ... définies. Merci.


J'ai le sentiment que les propriétés de la raison ne sont pas définies avant la fin d'une tâche est en raison de l'exécution parallèle. Msbuild ne garantit rien de mi-cible, car cette façon peut exécuter les sous-bargets en parallèle.


Dans cet exemple, la cible DOPackage n'a pas besoin du document DEPWEXTARGETS = "PACKAGE" car la cible de préemballage a déjà dépenpleustargets = "package". Il peut être utile de supprimer cet extra dépendReontargets = "package" si votre fichier de construction doit exécuter dopackage avec différentes valeurs de relisagedir. Comme: C: \ TMP2



1
votes

Si l'on veut passer une propriété à une cible, la tâche Msbuild peut être utile. C'est le seul moyen d'appeler une cible plusieurs fois avec différentes valeurs de propriété, mais cela ne permet pas de passer des objets ou des groupes d'articles. Voir ce Commentaire dans le fil qui Julien Liens vers.

... [C] toute la cible Msbuild à nouveau, cette fois-ci, passant dans les propriétés requises. Cela contourne un bâtiment incrémentiel ..., mais compte de nombreuses limitations, à savoir que vous ne pouvez pas passer des articles et vous devez spécifier quelles propriétés doivent être transmises.

Voici ce que votre extrait de code ressemblerait à l'aide de la tâche MSBuild: xxx

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


0 commentaires

1
votes

Ce n'est peut-être pas le moyen le plus propre de résoudre ce problème, mais si quelqu'un veut toujours utiliser CallTarget strong> dans le fichier de construction, il doit définir le groupe de propriété 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>


2 commentaires

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


@ Al-Muhandis, 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 à l'aide de CallTarget auraient la valeur. Essayez-vous vous-même