Unterdrücken von AfterBuild-Zielen, wenn kein csproj erstellt wurde

8

Ich habe ein Post-Build-Ziel in MSBuild, um einige Build-Ausgaben zu kopieren.

Dies ist als Abhängigkeit vom AfterBuild Ziel verknüpft (exposed by Microsoft.CSharp.targets ):

%Vor%

Gibt es eine Möglichkeit, die kopierten Dateien zu vermeiden, wenn der Build nicht wirklich neu erstellt wurde?

Wenn die MSBuild-Abhängigkeitsanalyse beispielsweise annimmt, dass das Projekt nicht erstellt werden muss, weil keine der Quelldateien aktualisiert wurde, wird es nicht erstellt, führt aber weiterhin mein Kopierziel aus. Gibt es eine Möglichkeit, dies zu verhindern?

    
Daniel Fortunov 05.02.2009, 14:55
quelle

7 Antworten

7

Da Sie das AfterBuild-Ziel überschreiben, wird es immer nach dem Build ausgeführt. Dies ist der Fall für eine Neuerstellung oder einen normalen Build. Wenn Sie nach der Neuerstellung einige Aktionen ausführen möchten (und nicht erstellen), sollten Sie die Abhängigkeitseigenschaft für das Rebuild-Ziel erweitern. Um in Ihrem Fall die Ziele nach einer Neuerstellung einzufügen, sollte Ihre Projektdatei etwa wie folgt aussehen:

%Vor%

Diese Methode erweitert die Eigenschaft, die die Rebuild-Ziele verwenden, um anzugeben, von welchen Zielen sie abhängt. Ich habe dies ausführlich im Artikel Inside MSBuild beschrieben, siehe Abschnitt Erweitern des Build-Prozesses .

Auch das, was Sie zu erreichen versuchen, kann durch das AfterBuild-Ziel erreicht werden, wenn Sie angeben können, welche Dateien " auslösen " eine Aktualisierung auslösen sollen. Mit anderen Worten, Sie können eine Reihe von "Eingaben" in das Ziel und eine Menge von "Ausgaben" spezifizieren, die beide Dateien sind. Wenn alle Ausgaben nach allen Eingaben erstellt würden, würde das Ziel aktuell betrachtet und übersprungen werden. Dieses Konzept wird als Incremental Building bezeichnet und ich habe es im Artikel MSBuild Best Practices Part 2 . Außerdem habe ich das in meinem Buch im Microsoft Build Engine: Verwenden von MSBuild und Team Foundation Build ausführlich beschrieben. p>

BEARBEITEN: Hinzufügen von BuildDependsOn Beispiel

Wenn das Ziel nur ausgeführt werden soll, wenn die Dateien tatsächlich erstellt werden, und nicht nur, wenn das Rebuild-Ziel ausgeführt wird. Dann sollten Sie Ihr Projekt wie folgt erstellen:

%Vor%

Ich habe nur die Ein- und Ausgänge des CoreCompile -Ziels innerhalb von Microsoft.CSharp.targets kopiert ( Ich gehe davon aus, dass Sie C # hier verwenden ) und haben es hier eingefügt . Dies bedeutet, dass das Ziel jedes Mal übersprungen wird, wenn das Ziel CoreCompile ausgeführt wird. Auch nachdem ich BuildDependsOn erweitert habe, wissen wir, dass MSBuild versuchen wird, es auszuführen, wenn das Projekt erstellt wird.

    
Sayed Ibrahim Hashimi 21.12.2009, 19:01
quelle
8

Ich habe das einfach gegoogelt und die jahrelange Antwort gefunden. Ich habe einen Weg gefunden, dies etwas leichter zu machen, indem ich eine Idee von Kernzielen stiehlt. Überschreibe sowohl BeforeBuild als auch AfterBuild und mache etwas wie:

%Vor%     
Steve Dillon 12.12.2012 21:31
quelle
6

Was ist mit der Verwendung der Eigenschaften von Inputs und Outputs, so wie es in compile target gemacht wurde?

%Vor%

Sie könnten das auf CopyPostBuildFiles und InstallUtil oder direkt auf AfterBuild verwenden.

Weitere Informationen zu Targets Inputs Outputs

finden Sie auf dieser Seite     
Julien Hoarau 06.02.2009 07:43
quelle
0

Build Zieldefinition ist:

%Vor%

Ich denke, dass CoreBuild nicht ausgeführt wird, wenn sich Ihre Dateien nicht geändert haben, also könnten Sie AfterCompile anstelle von AfterBuild verwenden.

%Vor%     
Julien Hoarau 05.02.2009 15:21
quelle
0

Was ist damit?

  
  • BuildBreak . Auf wahr gesetzt, wenn a   andernfalls tritt ein Kompilierungsfehler auf   falsch. Kann in Build-Breaks verwendet werden   Ziele, um festzustellen, ob sie es sind   Ausführen nach einem Übersetzungsfehler oder   normal ausführen.
  •   

Ссылка

Ich habe es nicht versucht, aber es klingt ziemlich vielversprechend.

    
Mark 05.02.2009 22:52
quelle
0

Dadurch wird das AfterBuild-Ziel genau dann aufgerufen, wenn die Projektzieldatei neu erstellt wurde:

%Vor%

Dies setzt voraus, dass Sie eine Eigenschaft $(DeployPath) definiert haben, die den Ordner identifiziert, in den Sie die Zielausgabedatei kopiert haben.

    
yoyo 07.06.2016 16:25
quelle
-1

Ich weiß nicht viel über MSBuild, aber im Fall der MSBuild-Projekte, die von Visual Studio für C # verwendet werden, gibt es eine einfache Alternative: Verwenden Sie ein Post-Build-Build-Ereignis anstelle eines AfterBuild-Ziels.

Sie können ein Post-Build-Build-Ereignis über den Visual Studio-Projekteigenschaften-Dialog auf der dritten Registerkarte "Build Events" einrichten. In einigen Situationen kann es eine Idee sein, einige Befehle in diesem Dialogfeld einzugeben und dann die .csproj-Datei direkt zu bearbeiten, sobald Sie festgestellt haben, wie es funktioniert.

Denken Sie daran, "Ausführen dieses Post-Build-Ereignisses: Wenn der Build die Projektausgabe aktualisiert" im Dialogfeld auszuwählen - das ist der Schlüssel, um die vom OP angeforderte Funktionalität zu erhalten.

Wie ich schon sagte, weiß ich nicht viel über MSBuild, und möglicherweise ist das Build-Ereignis nach dem Build für einige Dinge, die das AfterBuild-Ziel tun kann, nicht anwendbar. Aber ich habe es zum Kopieren von Dateien und zum Ausführen von BAT-Skripten verwendet, und dafür funktioniert es gut.

BEARBEITEN:

Ich füge ein paar Anmerkungen dazu hinzu, wie ich Post-Build-Ereignisse in meinen C # -Projekten normalerweise verwende.

Um verschiedene Bereiche der Funktionalität zu trennen, erstelle ich normalerweise ein BAT-Skript namens PostBuildEvent.bat und lege es in den gleichen Ordner wie die .csproj-Datei. Dann enthält mein Post-Build-Ereignis nur zwei Zeilen:

%Vor%

Dann lege ich die gewünschten Befehle in die Datei PostBuildEvent.bat. Hier ist ein Beispiel:

%Vor%

Beachten Sie, dass Sie zum Aufruf eines BAT-Skripts aus einem BAT-Skript explizit "call" angeben. Beachten Sie auch die Verwendung von "Pause" - dies ermöglicht es, das Skript durch einen Doppelklick auf die BAT-Datei zu testen und dann können Sie alle Fehlermeldungen im cmd-Fenster sehen. Die "Pause" wird ignoriert, wenn das Skript über MSBuild ausgeführt wird.

    
RenniePet 07.03.2013 21:27
quelle

Tags und Links