Événement de post-génération de Visual Studio - Copier vers l'emplacement du répertoire relatif


228

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

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 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 récupéré à partir de l'une des macros ci-dessus. Cependant, aucune des valeurs de macro ne répertorie uniquement l'emplacement parent.

Comment extraire uniquement l'emplacement de base de la commande de copie après génération?

Réponses:



293

Voici ce que vous voulez mettre dans la ligne de commande d'événement post-build 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.
Matt Montag

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

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

4
Je suggère d'utiliser $ (TargetName) au lieu de $ (ProjectName) dans la partie source.
Alexander Schmidt

2
mettre à jour mon précédent. commentaire copy /Y "$(TargetPath)" "$(SolutionDir)somewhere\":, sans la barre oblique inverse supplémentaire, puisque $ (SolutionDir) inclut une barre oblique inverse de fin (au moins dans VS2012)
glacial


10

Je pense que cela est lié, mais j'ai eu un problème lors de la construction directement à l'aide de la msbuildligne de commande (à 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>

(Remarque: start XCOPYplutôt XCOPYqu'utilisé pour contourner un problème d'autorisations qui empêchait la copie)

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

L'utilisation de la macro à la $(ProjectDir)..\place, ce qui revient au même, a bien fonctionné et a conservé le chemin d'accès complet dans les deux scénarios de génération.


1
réticulation vers le même hack au cas où j'oublierais de donner du crédit ...
drzaus

Starttravaillé pour moi (pour xcopyun dossier partagé).
AgentFire

4

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

Pour l'activer dans Visual Studio, accédez à Outils / Options, puis faites défiler l'arborescence jusqu'à la section intitulée Projets et solutions, développez-la et cliquez sur Générer et exécuter, à droite, une liste déroulante spécifiant la verbosité de la sortie de la génération , définissant cela sur diagnostic, vous montrera quelles autres valeurs de macro vous pouvez utiliser.

Parce que je ne sais pas exactement à 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 build, qui exécutent même du code SQL dans le cadre de la build. Si vous souhaitez plus d'aide ou même quelques exemples de scripts de build, faites-le moi savoir, mais si c'est juste un petit processus que vous voulez exécuter à la fin de la build, le lancement complet du script msbuild est peut-être un peu trop fatal .

J'espère que ça aide Rihan


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

Je ne savais pas que c'était vs2003, et donc l'utilisation de msbuild comme solution possible, si je me souviens que vs2003 était avant l'ère msbuild? Merci pour la réponse. Bonne chance avec VS 2003, je n'ai pas regardé en arrière après être passé à VS2005
Rihan Meij
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.