2009-05-07 7 views
172

Bei einem erfolgreichen Build möchte ich den Inhalt des Ausgabeverzeichnisses an einen anderen Speicherort unter dem gleichen "Basis" Ordner kopieren. Dieser übergeordnete Ordner ist ein relativer Teil und kann basierend auf den Einstellungen der Quellcodeverwaltung variieren.Visual Studio-Post-Build-Ereignis - Kopieren in relativen Verzeichnis-Speicherort

ich ein paar der Makro angegebenen Werte wurden mir zur Verfügung stehenden ...

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

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

ich möchte die Ausgabe Dir Inhalte in den folgenden Ordner kopieren:

D: \ GlobalDir \ Version \ AppName \ Solution2 \ Projekt \ Abhängigkeit

Der Basisspeicherort "D: \ GlobalDir \ Version \ AppName" muss aus einem der obigen Makros abgerufen werden. Keine der Makrowerte listet jedoch nur den übergeordneten Speicherort auf.

Wie extrahiere ich nur der Basisstandort für den Post-Build-Kopierbefehl?

Antwort

154

Wenn keine der TargetDir oder andere Makros an die richtige Stelle verweisen, verwenden Sie die „..“ Verzeichnis rückwärts auf der Ordnerhierarchie zu gehen.

dh. Verwenden Sie $(SolutionDir)\..\.., um Ihr Basisverzeichnis zu erhalten.


Für Liste aller Makros finden Sie hier:

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

+1

Dies ist auch hilfreich: http://msdn.microsoft.com/en-us/library/c02as0cs.aspx – Eric

36

Sie könnten versuchen:

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

Bitte beachten Sie, dass die Variable $ (SolutionDir) bereits den umgekehrten Schrägstrich hat. Quelle: "Das Verzeichnis der Lösung (definiert mit Laufwerk und Pfad); enthält den abschließenden umgekehrten Schrägstrich" \ "." https://msdn.microsoft.com/en-us/library/42x5kfw4.aspx – Snicker

2

Wäre es nicht sinn msbuild direkt zu bedienen? Wenn Sie dies mit jedem Build tun, können Sie am Ende eine Msbuild-Aufgabe hinzufügen? Wenn Sie nur sehen möchten, ob Sie einen anderen Makrowert nicht finden können, der nicht in der Visual Studio IDE angezeigt wird, können Sie die Msbuild-Optionen für die Diagnose aktivieren und Ihnen alle Variablen anzeigen, die Sie verwenden könnten genau wie ihr aktueller Wert.

Um diese Option in Visual Studio einzuschalten, gehen Sie zu Extras/Optionen, scrollen Sie dann in der Baumansicht zu dem Abschnitt Projekte und Lösungen, erweitern Sie das und klicken Sie auf Erstellen und Ausführen, auf der rechten Seite ist ein Dropdown-Feld Die Ausführlichkeit der Build-Ausgabe, die auf Diagnostic gesetzt wird, zeigt Ihnen, welche anderen Makrowerte Sie verwenden könnten.

Da ich nicht genau weiß, auf welchem ​​Level Sie gerne gehen würden und wie komplex Ihr Build sein soll, könnte Ihnen das eine Idee geben. Ich habe kürzlich Build-Skripte gemacht, die sogar SQL-Code als Teil des Builds ausführen. Wenn Sie weitere Hilfe oder sogar einige Beispiel-Build-Skripte benötigen, lassen Sie es mich wissen, aber wenn es nur ein kleiner Prozess ist, den Sie am Ende des Builds ausführen möchten, ist das vollständige Skript msbuild möglicherweise ein bisschen überkillt .

Hoffen, dass es Rihan

+0

thx Rihan, aber anscheinend scheint VS 2003 das nicht zu unterstützen! Ich bin natürlich ziemlich zufrieden mit dem Post-Build-Event ;-) – Preets

+0

Ich wusste nicht, dass es vs2003 war, und daher die Verwendung von Msbuild als eine mögliche Lösung, wenn ich mich erinnere vs2003 war vor der Msbuild-Ära? Danke für die Antwort. Viel Glück mit VS 2003, ich schaute nicht zurück nach dem Wechsel zu VS2005 –

205

Hier hilft das, was Sie in der Projektpostbuildereignis Befehlszeile setzen wollen:

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

EDIT: Oder wenn Ihr Zielname ist anders als der Projektname .

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

Guter Tipp. Ich habe die Zitate vergessen. –

+2

Es hat nicht funktioniert, weil ich das '/ Y' vergessen habe. Danke, dass du den ganzen Befehl gezeigt hast. – Mark

+6

Man kann 'xcopy' mit Platzhaltern und den entsprechenden Schaltern verwenden, um ein ähnliches Ergebnis zu erzielen, während die Struktur des Quellordners (Baumstruktur) beibehalten wird, z. B .:" xcopy/i/e/s/y/f " \ MyFolder \ * "" \ MyFolder "' – Dr1Ku

8

Ich denke, das verwandt ist, aber ich hatte ein Problem, wenn sie direkt mit msbuild Zeilenbefehl Gebäuden (aus einer Batch-Datei) vs Gebäude aus VS.

Mit so etwas wie folgt aus:

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

(Anmerkung: start XCOPY statt XCOPY verwendet um ein Problem mit den Berechtigungen zu erhalten, die das Kopieren verhindert)

Das Makro $(SolutionDir)-..\ ausgewertet, wenn msbuild Ausführung aus einer Batchdatei, was dazu führte, dass der Befehl XCOPY fehlgeschlagen ist. Es funktionierte ansonsten gut, wenn es in Visual Studio erstellt wurde. Bestätigt mit /verbosity:diagnostic, um den bewerteten Ausgang zu sehen.

Die Verwendung des Makros $(ProjectDir)..\ statt, das auf dasselbe hinausläuft, funktionierte gut und behielt den vollständigen Pfad in beiden Build-Szenarien bei.

+1

Querverweis zum [selbe hack] (http://Stackoverflow.com/a/20638116/1037948) für den Fall, dass ich vergaß, Kredit zu geben ... – drzaus

+0

Gut gemacht, arbeitete das Beste aus allen Antworten – AgentFire

+0

'Start' arbeitete für mich (für' xcopy' in einem freigegebenen Ordner). – AgentFire