Ziel nicht ausgeführt wird, wenn mit BeforeTargets="Build" auf dem Build-Server
Habe ich ein custom .Ziele-Datei, die ich Importiere in mein C# MVC web-Anwendung-Projekt-Datei. Ich habe Hinzugefügt, benutzerdefinierte Ziele, auf das wie so:
<Target Name="CopyFiles" BeforeTargets="Build"></Target>
Dies funktioniert gut, wenn Gebäude unter Visual Studio, aber wenn ich TeamCity erstellen, das Ziel wird nie ausgeführt, und ich kann nicht herausfinden, warum.
Wenn ich mein Ziel nicht zu verwenden BeforeTargets="Compile", dann läuft es. Alternativ, wenn ich das hinzufügen eines zusätzlichen Objekts mit dem Namen Build der .targets-Datei
<Target Name="Build" />
dann wird es laufen, aber damit überschreibt die vorhandene Build-Ziel, so dass meine Anwendung nicht erstellen. Ich kann nicht ganz aus der Logik dieser - es macht keinen Sinn. Ich bin mit dem Kompilier-Ziel für jetzt, aber wenn jemand könnte erklären, warum versuche, es auszuführen, bevor Sie die Build-Aufgabe funktioniert nicht, ich würde es wirklich schätzen.
- Ist Ihre benutzerdefinierte Ziele-Datei wird abgeholt, von TeamCity? Hat es auf jeden Fall Hinzugefügt worden, um Sie VCS?
- Ja, und ja. Wie bereits erwähnt, wenn ich es verwenden BeforeTargets="Compile", dann läuft es. Nur nicht mit der Build-task.
Du musst angemeldet sein, um einen Kommentar abzugeben.
'Bauen' ist eine spezielle built-in-target, also nicht wirklich funktionieren auf die gleiche Weise wie die meisten anderen Ziele. Es kann definitiv nicht sein, sicher überschrieben.
Die entsprechende Dokumentation ist hier: https://msdn.microsoft.com/en-us/library/ms366724.aspx
Wenn Sie etwas wollen, führen Sie vor zu bauen, die standard-Ansatz (wie empfehlen die Kommentare in einem neu erstellt .csproj-Datei) ist das überschreiben der BeforeBuild-Ziel (wie oben beschrieben).
Dies ist jedoch nicht die stabilste Lösung. Wie bereits in der Dokumentation oben:
Ist es besser (und nur etwas komplexer), das überschreiben der BuildDependsOn Eigentum und Erweiterung der default-Wert dieser Eigenschaft enthalten das Ziel, das Sie ausführen möchten (dies ist auch dokumentiert in dem link oben).
Ein anderer Ansatz wäre, zu verlassen BeforeBuild leer und verwenden Sie
BeforeTargets="BeforeBuild"
, die fühlt sich ein wenig seltsam, aber ist ziemlich einfach und wird immer noch funktionieren, auch wenn die BeforeBuild Ziel wird überschrieben.Warum
BeforeTargets="Build"
funktioniert nicht, ich kann nicht finden, einen Verweis dazu in der Dokumentation, aber ich denke, es ist mit seiner besonderen Natur. Es funktioniert nicht das gleiche wie normale Ziele, und es ist wahrscheinlich besser, nicht zu denken, es als ein Ziel an alle.Build
definiert ist, inMicrosoft.Common.CurrentVersion.targets
aus und verhält sich wie jedes andere Ziel.BeforeTargets="Build"
ist vollkommen gültig. Das Problem ist, dass dieBuild
Ziel ist ein virtueller Gegner ohne wirklichen Körper und ist nicht immer genannt, je nach situation. Einzelheiten variieren je nach VS-version und Art des Projekts, vor allem mit web-Projekte, die kommen in viel zu vielen Varianten. Dies ist der Grund, warumBeforeBuild
ist als eine garantierte extension-point für alles, was aufMicrsoft.Common.targets
.