Visual Studio Post Build-Ereignis - In relativen Verzeichnisverzeichnis kopieren

228

Bei einem erfolgreichen Build möchte ich den Inhalt des Ausgabeverzeichnisses an einen anderen Speicherort unter demselben "Basis" -Ordner kopieren . Dieser übergeordnete Ordner ist ein relativer Teil und kann je nach den Einstellungen der Quellcodeverwaltung variieren.

Ich habe einige der mir zur Verfügung stehenden Makrowerte aufgelistet ...

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

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

Ich möchte den Inhalt des Ausgabeverzeichnisses in den folgenden Ordner kopieren:

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

Der Basisspeicherort "D: \ GlobalDir \ Version \ AppName" muss von einem der oben genannten Makros abgerufen werden. Keiner der Makrowerte listet jedoch nur den übergeordneten Speicherort auf.

Wie extrahiere ich nur den Basisspeicherort für den Befehl zum Erstellen nach dem Erstellen?

Preets
quelle

Antworten:

188

Wenn keines der TargetDir- oder anderen Makros auf die richtige Stelle verweist, verwenden Sie das Verzeichnis "..", um die Ordnerhierarchie rückwärts zu verschieben.

dh. Verwenden $(SolutionDir)\..\..Sie diese Option , um Ihr Basisverzeichnis abzurufen.


Eine Liste aller Makros finden Sie hier:

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

gbjbaanb
quelle
Vielen Dank!! Guter Tipp
Merlyn007
293

Folgendes möchten Sie in die Befehlszeile für Post-Build-Ereignisse des Projekts einfügen:

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

BEARBEITEN: Oder wenn sich Ihr Zielname vom Projektnamen unterscheidet.

copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)lib\$(TargetName).dll"
Lucas B.
quelle
1
Guter Tipp. Ich habe die Zitate vergessen.
Matt Montag
3
Es hat bei mir nicht funktioniert, weil ich das vergessen habe /Y. Vielen Dank, dass Sie den gesamten Befehl angezeigt haben.
Mark
10
Man kann xcopymit Platzhaltern und den entsprechenden Schaltern verwenden, um ein ähnliches Ergebnis zu erzielen, während die (Baum-) Struktur des xcopy /i /e /s /y /f "<source>\MyFolder\*" "<destination>\MyFolder"
Quellordners
4
Ich würde vorschlagen, $ (TargetName) anstelle von $ (ProjectName) im Quellteil zu verwenden.
Alexander Schmidt
2
Update auf meine prev. Kommentar: copy /Y "$(TargetPath)" "$(SolutionDir)somewhere\"ohne den zusätzlichen Backslash, da $ (SolutionDir) einen nachgestellten Backslash enthält (zumindest in VS2012)
eisiger
40

Du könntest es versuchen:

$(SolutionDir)..\..\
Ichiban
quelle
8
Bitte beachten Sie, dass die Variable $ (SolutionDir) bereits den Schrägstrich enthält. Quelle: "Das Verzeichnis der Lösung (definiert mit Laufwerk und Pfad); enthält den nachfolgenden Backslash '\'." msdn.microsoft.com/en-us/library/42x5kfw4.aspx
Snicker
10

Ich denke, das hängt damit zusammen, aber ich hatte ein Problem beim Erstellen direkt über die msbuildBefehlszeile (aus einer Batch-Datei) im Vergleich zum Erstellen innerhalb von VS.

Verwenden Sie so etwas wie das Folgende:

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

(Hinweis: start XCOPYAnstatt XCOPYverwendet zu werden, um ein Berechtigungsproblem zu umgehen, das das Kopieren verhindert hat)

Das Makro $(SolutionDir)ausgewertet , ..\wenn msbuild aus einer Batch - Datei ausgeführt wird , die in der Folge XCOPYBefehl fehlschlägt. Ansonsten hat es gut funktioniert, wenn es in Visual Studio erstellt wurde. Bestätigt mit /verbosity:diagnostic, um die ausgewertete Ausgabe anzuzeigen.

Die Verwendung des Makros $(ProjectDir)..\, das sich auf dasselbe beläuft, hat einwandfrei funktioniert und in beiden Build-Szenarien den vollständigen Pfad beibehalten.

drzaus
quelle
1
Vernetzung mit dem gleichen Hack für den Fall, dass ich vergessen habe, Kredit zu geben ...
drzaus
Startarbeitete für mich (für xcopyin einem freigegebenen Ordner).
AgentFire
4

Wäre es nicht sinnvoll, msbuild direkt zu verwenden? Wenn Sie dies bei jedem Build tun, können Sie am Ende eine msbuild-Aufgabe hinzufügen? Wenn Sie nur sehen möchten, ob Sie keinen anderen Makrowert finden, der nicht in der Visual Studio-IDE angezeigt wird, können Sie die msbuild-Optionen auf Diagnose aktivieren und alle Variablen anzeigen, die Sie als verwenden können sowie ihren aktuellen Wert.

Um dies in Visual Studio zu aktivieren, gehen Sie zu Extras / Optionen, scrollen Sie in der Baumansicht nach unten zum Abschnitt Projekte und Lösungen, erweitern Sie diesen und klicken Sie auf Erstellen und Ausführen. Rechts befindet sich eine Dropdown-Liste, in der die Ausführlichkeit der Build-Ausgabe angegeben ist Wenn Sie dies auf Diagnose setzen, sehen Sie, welche anderen Makrowerte Sie verwenden können.

Da ich nicht genau weiß, auf welche Ebene Sie gehen möchten und wie komplex Ihr Build sein soll, kann dies Ihnen eine Vorstellung geben. Ich habe kürzlich Build-Skripte erstellt, 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. Wenn es sich jedoch nur um einen kleinen Prozess handelt, den Sie am Ende des Builds ausführen möchten, ist das vollständige Ausführen des vollständigen msbuild-Skripts möglicherweise etwas übertrieben .

Hoffe es hilft Rihan

Rihan Meij
quelle
Danke Rihan, aber anscheinend scheint VS 2003 dies nicht zu unterstützen! Ich bin natürlich ziemlich zufrieden mit dem Post Build Event ;-)
Preets
Ich wusste nicht, dass es vs2003 war, und daher war die Verwendung von msbuild als mögliche Lösung, wenn ich mich erinnere, vs2003 vor der msbuild-Ära? Danke für die Antwort. Viel Glück mit VS 2003, ich habe nicht zurückgeschaut, nachdem ich zu VS2005 übergegangen bin
Rihan Meij