web-dev-qa-db-fra.com

Visual Studio Post Build Event - Copier vers l'emplacement du répertoire relatif

En cas de réussite de la construction, je souhaite copier le contenu du répertoire de sortie dans un emplacement différent sous le même dossier "base". Ce dossier parent est une partie relative et peut varier en fonction des paramètres du contrôle de source.

J'ai énuméré quelques-unes des valeurs de macro disponibles pour moi ...

$ (SolutionDir) = D:\GlobalDir\Version\NomApp\Solution1\build

$ (ProjectDir) = D:\GlobalDir\Version\NomApp\Solution1\Version\ProjectA \

Je souhaite copier le contenu du répertoire de sortie dans le dossier suivant:

D:\GlobalDir\Version\AppName\Solution2\Project\Dependency

L'emplacement de base "D:\GlobalDir\Version\AppName" doit être extrait de l'une des macros ci-dessus. Cependant, aucune des valeurs de macro ne contient la liste niquement l'emplacement parent.

Comment extraire niquement l'emplacement de base de la commande post build build?

212
Preets

Si aucun de TargetDir ou d'autres macros ne pointe au bon endroit, utilisez le répertoire ".." pour remonter dans la hiérarchie des dossiers.

c'est à dire. Utilisez $(SolutionDir)\..\.. pour obtenir votre répertoire de base.


Pour la liste de toutes les macros, voir ici:

http://msdn.Microsoft.com/en-us/library/c02as0cs.aspx

176
gbjbaanb

Voici ce que vous souhaitez mettre dans la ligne de commande de l'événement post-génération du projet:

copy /Y "$(TargetDir)$(ProjectName).dll" "$(SolutionDir)lib\$(ProjectName).dll"

EDIT: ou si votre nom de cible est différent du nom du projet.

copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)lib\$(TargetName).dll"
268
Lucas B

Tu pourrais essayer:

$(SolutionDir)..\..\
40
ichiban

Je pense que cela est lié, mais j’ai eu un problème lors de la construction directe en utilisant la ligne de commande msbuild (à partir d’un fichier de commandes) par rapport à la construction à partir de VS.

En utilisant quelque chose comme ce qui suit:

<PostBuildEvent>
  MOVE /Y "$(TargetDir)something.file1" "$(ProjectDir)something.file1"
  start XCOPY /Y /R "$(SolutionDir)SomeConsoleApp\bin\$(ConfigurationName)\*" "$(ProjectDir)App_Data\Consoles\SomeConsoleApp\"
</PostBuildEvent>

(note: start XCOPY plutôt que XCOPY utilisé pour contourner un problème d'autorisations empêchant la copie)

La macro $(SolutionDir) évaluée à ..\ lors de l'exécution de msbuild à partir d'un fichier batch, ce qui a entraîné l'échec de la commande XCOPY. Autrement, cela fonctionnait bien lorsqu'il était créé à partir de Visual Studio. Confirmé en utilisant /verbosity:diagnostic pour voir la sortie évaluée.

Utiliser la macro $(ProjectDir)..\ à la place, ce qui revient au même, fonctionne bien et conserve le chemin d'accès complet dans les deux scénarios de construction.

10
drzaus

Ne serait-il pas logique d'utiliser msbuild directement? Si vous faites cela avec chaque build, vous pouvez alors ajouter une tâche msbuild à la fin? Si vous souhaitez simplement voir si vous ne pouvez pas trouver une autre valeur de macro qui n'est pas affichée dans l'IDE de Visual Studio, vous pouvez activer les options msbuild pour le diagnostic et afficher toutes les variables que vous pouvez utiliser, comme ainsi que leur valeur actuelle.

Pour l'activer dans Visual Studio, allez dans Outils/Options, puis faites défiler l'arborescence jusqu'à la section intitulée Projets et solutions, développez-le et cliquez sur Construire et exécuter. À droite, un menu déroulant spécifiant le niveau de sortie de la construction , en définissant cela sur diagnostic, vous indiquera les autres valeurs de macro que vous pouvez utiliser.

Parce que je ne sais pas trop à quel niveau vous souhaitez aller, ni à quel point vous voulez que votre construction soit complexe, cela pourrait vous donner une idée. J'ai récemment fait des scripts de construction, qui exécutent même du code SQL dans le cadre de la construction. Si vous souhaitez plus d'aide ou même des exemples de scripts de génération, faites-le moi savoir, mais s'il ne s'agit que d'un petit processus que vous souhaitez exécuter à la fin de la construction, le script msbuild complet peut-être un peu trop fatal. .

J'espère que ça aide Rihan

4
Rihan Meij