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

Preets
la source

Réponses:

188

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

gbjbaanb
la source
Merci!! Bon conseil
Merlyn007
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"
Lucas B
la source
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
40

Tu pourrais essayer:

$(SolutionDir)..\..\
ichiban
la source
8
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" \ "." msdn.microsoft.com/en-us/library/42x5kfw4.aspx
Snicker
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.

drzaus
la source
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

Rihan Meij
la source
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