2017-08-31 3 views
1

Meine benutzerdefinierten MSBuild-Aufgaben führt einige Schritte vor und nach dem tatsächlichen Build. Es ist wichtig, dass die Schritte nach dem Build immer ausgeführt werden, um einige Dateien zu bereinigen. Im Moment habe ich zwei Ziele definiert:Führen Sie ein MSBuild-Ziel nach einem fehlgeschlagenen Build aus

<Target Name="NrtPatchAssemblyInfo" BeforeTargets="BeforeBuild"> 

und

<Target Name="NrtRestoreAssemblyInfo" AfterTargets="AfterBuild"> 

Die erste wird immer dann ausgeführt, aber die zweite läuft erst nach einem erfolgreichen Build. Wenn der Build vom Compiler fehlgeschlagen ist, z. B. aufgrund eines Syntaxfehlers in einer Codedatei, wird das zweite Ziel nicht ausgeführt.

Was kann ich tun, um dies zu ändern und immer die zweite Aufgabe ausführen zu lassen?

Ich konnte keine Liste der Zielnamen finden, die MSBuild normalerweise verwendet. Diese Namen werden nur aus anderen Quellen kopiert.

Antwort

0

MsBuild beendet die Ausführung weiterer Ziele, wenn ein Fehler auftritt (es sei denn, ContinueOnError wird irgendwo geändert, aber Sie können nicht alle installierten msbuild-Dateien bearbeiten, damit dies funktioniert). Eine Lösung besteht darin, das OnError Element zu verwenden. Dies muss auf das Ziel gesetzt werden, das fehlschlägt (oder ein Elternteil dieses Ziels, nehme ich an), also müssen Sie ein auswählen, das im tatsächlichen Aufbau benutzt wird und es überschreiben. Bei einem C++ - Build überschreiben Sie das Build-Ziel, kopieren die Definition aus Microsoft.Common.CurrentVersion.targets und fügen OnError hinzu. Beispiel-Code (muss nach dem Microsoft.Cpp.targets Import in der Projektdatei eingefügt werden!):

<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> 
<Target Name="RunOnError"> 
    <Message Text="OOPS!" /> 
</Target> 
<Target 
    Name="Build" 
    Condition="'$(_InvalidConfigurationWarning)' != 'true'" 
    DependsOnTargets="$(BuildDependsOn)" 
    Returns="$(TargetPath)"> 
    <OnError ExecuteTargets="RunTargetAfterBuild" /> 
</Target> 

Um herauszufinden, welche nur erhalten ausgeführt zielt auf die Build mit Detail Ausführlichkeit laufen.

+0

Keine Ziele mehr, wenn man scheitert? Wie kann ich dann nach einem Fehler Bereinigungsarbeiten oder andere Maßnahmen durchführen? Das Kopieren der Visual Studio-Infrastruktur ist (noch) keine Option für mich. – ygoe

+1

Sie könnten auch die Notwendigkeit der Bereinigung entfernen: viel einfacher zu beheben Imo. Erstellen Sie eine Kopie der Datei, für die Sie die Assembly-Informationen patchen möchten, kopieren Sie sie in das Zwischenverzeichnis, und verwenden Sie diese Kopie im Build. Es spielt keine Rolle, wenn die Änderungen an der Kopie nicht rückgängig gemacht werden. – stijn

+0

Ich bin endlich auf dieses Thema zurückgekommen. Ich habe mein Tool geändert, um die Datei nicht zu patchen und wiederherzustellen, sondern die geänderte Datei in ein Objekt zu speichern und das (Include) anstelle der ursprünglichen Datei (Remove) zu verwenden. – ygoe

Verwandte Themen