2009-05-07 6 views
172

En cas de création réussie, je souhaite copier le contenu du répertoire de sortie vers 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 de contrôle de source.Événement Visual Studio Post Build - Copier vers l'emplacement du répertoire relatif

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

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

$ (ProjectDir) = D: \ GlobalDir \ version \ AppName \ Solution1 \ version \ ProjectA \

Je veux copier le contenu de sortie Dir 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 macros n'indique seulement l'emplacement parent.

Comment puis-je extraire seulement l'emplacement de base de la commande de copie post-construction?

Répondre

154

Si aucune des TargetDir ou d'autres macros pointer vers le bon endroit, utilisez le « .. » répertoire pour revenir en arrière dans la hiérarchie des dossiers.

ie. Utilisez $(SolutionDir)\..\.. pour obtenir votre répertoire de base.


Pour une liste de toutes les macros, voir ici:

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

+1

Ceci est utile, aussi: http://msdn.microsoft.com/en-us/library/c02as0cs.aspx – Eric

36

Vous pouvez essayer:

$(SolutionDir)\..\..\ 
+5

Veuillez garder à l'esprit que la variable $ (SolutionDir) a déjà la barre oblique inverse. Source: "Le répertoire de la solution (défini avec le lecteur et le chemin), inclut la barre oblique inverse" \ "." https://msdn.microsoft.com/en-us/library/42x5kfw4.aspx – Snicker

2

serait-il pas judicieux d'utiliser msbuild directement? Si vous faites cela avec chaque build, alors vous pouvez ajouter une tâche msbuild à la fin? Si vous voulez simplement voir si vous ne pouvez pas trouver une autre valeur de macro qui n'est pas montrée sur l'IDE de Visual Studio, vous pouvez passer les options de msbuild au diagnostic et cela vous montrera toutes les variables que vous pourriez employer, 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 Projets et solutions, développez-la et cliquez sur Construire et Exécuter, à droite, c'est un menu déroulant qui spécifie la verbosité de sortie de la construction, en définissant cela comme diagnostic, vous montrera quelles autres valeurs de macros vous pourriez utiliser. Parce que je ne sais pas à quel niveau vous aimeriez aller, et à 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 voulez de l'aide ou même des exemples de scripts de construction, faites le moi savoir, mais si c'est un petit processus que vous voulez exécuter à la fin de la construction, le script msbuild est peut-être un peu trop puissant .

Hope it helps Rihan

+0

thx Rihan, mais apparemment VS 2003 ne semble pas soutenir cela! Je suis bien sûr tout à fait satisfait de l'événement post build ;-) – Preets

+0

Je ne savais pas que c'était vs2003, et donc l'utilisation de msbuild comme une solution possible, si je me souviens de vs2003 était pré ère msbuild? Merci pour la réponse. Bonne chance avec VS 2003, je ne me suis pas retourné après VS2005 –

205

Voici ce que vous voulez mettre dans la commande Evenement ligne post-construction du projet:

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

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

copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)lib\$(TargetName).dll" 
+1

Bon conseil. J'ai oublié les citations. –

+2

Cela ne fonctionnait pas pour moi parce que j'avais oublié le '/ Y'. Merci d'avoir montré toute la commande. – Mark

+6

On peut utiliser 'xcopy' avec des caractères génériques et les commutateurs appropriés pour obtenir un résultat similaire, tout en conservant la structure (arborescente) du dossier source, telle que:' xcopy/i/e/s/y/f " \ MyFolder \ * "" \ MyFolder "' – Dr1Ku

8

Je pense que cela est lié, mais j'ai eu un problème lors de la construction en utilisant directement la ligne de commande msbuild (à partir d'un fichier batch) vs immeuble de l'intérieur 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 qui a empêché la copie)

La $(SolutionDir) macro évaluée à ..\ lors de l'exécution msbuild à partir d'un fichier batch, qui a entraîné l'échec de la commande XCOPY. Cela a fonctionné autrement bien à partir de Visual Studio. Confirmé en utilisant /verbosity:diagnostic pour voir la sortie évaluée. L'utilisation de la macro $(ProjectDir)..\ à la place, ce qui équivaut à la même chose, a fonctionné correctement et a conservé le chemin complet dans les deux scénarios de génération.

+1

hack] (http://stackoverflow.com/a/20638116/1037948) au cas où j'ai oublié de donner crédit ... – drzaus

+0

Bravo, travaillé le meilleur de toutes les réponses – AgentFire

+0

'Start' travaillé pour moi (pour' xcopy' dans un dossier partagé). – AgentFire