Question

J'essayais de rendre une tâche dans mes versions de TFS plus générique, et l'une des choses que j'essaie de faire est de copier des fichiers dans des répertoires différents en fonction de la construction utilisant la tâche. J'ai eu l'idée d'utiliser des propriétés, mais je ne pouvais pas trouver un moyen de le faire proprement. J'ai donc essayé d'utiliser des métadonnées d'élément, car j'ai pu le faire à un autre endroit du même fichier cible. Je travaille, mais cette fois-ci, j'aimerais utiliser les propriétés.

Voici ce que je veux faire:

<ItemGroup>
  <DestinationParent Include="$(DeploymentPath)">
    <DestinationParentPath>$(DeploymentPath)</QuartzParentPath>
  </DestinationParent>
</ItemGroup>

Et plus tard dans la construction, j'ai essayé de copier certains fichiers dans le dossier de destination en référençant les métadonnées de l'élément:

<Copy SourceFiles="@(FilesToCopy)" DestinationFiles="@(FilesToCopy-&gt;'%(DestinationParentPath)\Destination\%(RecursiveDir)%(Filename)%(Extension)')" ContinueOnError="false" ></Copy>

Malheureusement, après la compilation, mon BuildLog affiche les informations suivantes:

Copying file from "$(BinariesRoot)\%(ConfigurationToBuild.FlavorToBuild)\<File being copied>" to "\Destination\<File being copied>".

% (DestinationParentPath) a été étendu à une chaîne vide, quelle qu'en soit la raison. L'utilisation de% (DestinationParent.DestinationParentPath) a généré une erreur, me disant que je devrais simplement utiliser% (DestinationParentPath). $ (DeploymentPath) est étendu à la chaîne correcte comme prévu à plusieurs autres endroits de la construction.

Une autre source de confusion est que l’utilisation de% (ConfigurationToBuild.FlavorToBuild) a donné la valeur correcte, c’est-à-dire Test, comme le montre ce qui suit:

EDIT: ceci est défini sous le noeud racine Project, alors que ItemGroup avec DestinationParentPath est défini sous un noeud Target. Est-ce que cela fait aussi une différence?

<ItemGroup>
  <ConfigurationToBuild Include="Test|Any CPU">
    <FlavorToBuild>Test</FlavorToBuild>
    <PlatformToBuild>Any CPU</PlatformToBuild>
  </ConfigurationToBuild>
</ItemGroup>

Il ne semble pas que l'attribut Include soit pertinent lorsque vous êtes uniquement intéressé par la chaîne dans les métadonnées de l'élément, car je suis à peu près sûr "Test | Tout processeur". ne fait référence à aucun fichier réel.

Encore une fois, pourquoi% (DestinationParentPath) passe-t-il à une chaîne vide?

EDIT: j'ai oublié de mentionner que j'ai également essayé de coder en dur le chemin réel de DestinationParentPath, mais cela a néanmoins entraîné l'extension de% (DestinationParentPath) en une chaîne vide.

Était-ce utile?

La solution

  

EDIT: ceci est défini sous le noeud racine Project, alors que ItemGroup avec DestinationParentPath est défini sous un noeud Target. Est-ce que cela fait aussi une différence?

Oui, cela fait une différence. Msbuild 3.5 a la possibilité de définir un groupe d'éléments à l'intérieur d'une cible. Malgré l'apparence déclarative, il est exécuté au moment de l'exécution, exactement comme si vous aviez appelé les tâches à l'ancien style CreateItem / CreateProperty. Cela seul pose des problèmes potentiels: vous devez prendre en compte le moment où la tâche qui contient est (en premier) appelée. L'ordre des opérations n'est pas toujours évident pour le nu œil . Il peut être judicieux de faire en sorte que la tâche pour laquelle vous utilisez% (DestinationParentPath) dépende de la tâche pour laquelle elle est créée, même s’il n’ya pas de paramètre "logique". dépendance.

De plus, il existe des remèdes séculaires de type msbuild très anciens. Propriétés créées dynamiquement & amp; les éléments ne sont pas visibles par " frères et soeurs " tâches . En outre, éléments mis à jour dans nested les versions ne sont pas toujours bouillies .

Découvrez les solutions de contournement dans les liens: vous devriez pouvoir trouver quelque chose qui fonctionne pour vous, même si c'est dégoûtant.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top