Derzeit packe ich die Release-Builds mit Nuget für die offiziellen Builds auf nuget.org, aber ich packe die Debug-Builds mit Nuget für die Symbolquellen-Pushs auf symbellsource.org.
EDIT: (Jon Skeet, mit einigen Vorurteilen von Noda Time Entwicklung)
NuGet unterstützt jetzt das Pushen sowohl zur NuGet-Galerie als auch zu Symbolsource.org (oder ähnlichen Servern), wie dokumentiert . Leider gibt es hier zwei widersprüchliche Anforderungen:
- Wenn nur mit einer Bibliothek , ohne dass für das Debuggen, wollen Sie wirklich ein Release - Build. Dafür sind schließlich Release-Builds gedacht.
- Wenn Sie zu Diagnosezwecken in eine Bibliothek debuggen, möchten Sie wirklich einen Debug-Build, bei dem alle entsprechenden Optimierungen deaktiviert sind. Dafür sind Debug-Builds schließlich da.
Das wäre in Ordnung, aber NuGet erlaubt (soweit ich das beurteilen kann) nicht, dass sowohl die Release- als auch die Debug-Builds auf nützliche Weise im selben Paket veröffentlicht werden.
Die Auswahlmöglichkeiten sind also:
- Verteilen Sie die Debug-Builds an alle (wie im Beispiel in den Dokumenten gezeigt) und leben Sie mit Treffern jeder Größe und Leistung.
- Verteilen Sie die Release-Builds an alle und leben Sie mit einer leicht beeinträchtigten Debug-Erfahrung.
- Entscheiden Sie sich für eine wirklich komplizierte Verteilungsrichtlinie, die möglicherweise separate Release- und Debug-Pakete bereitstellt.
Die ersten beiden beschränken sich wirklich auf die Unterschiede zwischen Debug- und Release-Builds ... obwohl es erwähnenswert ist, dass es auch einen großen Unterschied gibt, ob Sie in den Code einer Bibliothek eintreten möchten, weil Sie ein bestimmtes Verhalten überprüfen möchten oder nicht um den Code einer Bibliothek zu debuggen, weil Sie glauben, einen Fehler gefunden zu haben. Im zweiten Fall ist es wahrscheinlich besser, den Code der Bibliothek als Visual Studio-Lösung abzurufen und auf diese Weise zu debuggen, damit ich dieser Situation nicht zu viel Aufmerksamkeit schenke.
Meine Versuchung ist einfach zu halten mit der Release - Builds, mit der Erwartung , dass relativ wenige Menschen zu debuggen benötigen, und diejenigen , die tun nicht beeinträchtigt werden viel von den Optimierungen in dem Release - Build. (Der JIT-Compiler übernimmt sowieso den größten Teil der Optimierung.)
Gibt es andere Optionen, die wir nicht in Betracht gezogen hatten? Gibt es andere Überlegungen, die das Gleichgewicht beeinflussen? Ist die Weitergabe von NuGet-Paketen an SymbolSource so neu, dass "Best Practice" wirklich nicht etabliert wurde?
nuget pack ... -Symbol
die generierten Pakete verwende und pushe ...Antworten:
Wenn ich für SymbolSource spreche, glaube ich, dass die beste Vorgehensweise darin besteht:
Während wir gerade dabei sind, ist es ein weit verbreitetes Missverständnis, dass Release- und Debug-Builds in .NET sehr unterschiedlich sind, aber ich gehe davon aus, dass die Unterscheidung hier auf verschiedenen Code zurückzuführen ist, der in beiden Builds enthalten sein kann oder nicht, wie z. B. Debug .Asserts.
Trotzdem lohnt es sich wirklich, beide Konfigurationen auf SymbolSource zu übertragen, da Sie nie wissen, wann Sie Produktionscode debuggen müssen. Remote in der Produktion, um es schwieriger zu machen. In diesem Fall benötigen Sie die Hilfe, die Sie von Ihren Werkzeugen erhalten können. Was ich natürlich niemandem wünsche.
Bei der Versionierung ist noch einiges zu beachten: Ist es richtig, zwei verschiedene Pakete (im Debug und in der Version eingebaut) mit einer Versionsnummer zu haben? SymbolSource würde dies akzeptieren, da es Pakete extrahiert und Binärdateien in separaten Zweigen im Erstellungsmodus speichert, WENN NUR NuGet Pakete entsprechend kennzeichnen darf. Derzeit gibt es keine Möglichkeit festzustellen, ob sich ein Paket im Debug- oder Release-Modus befindet.
quelle
Debug.Assert
usw. - aber könnten Sie (in Ihrer Antwort) die Auswirkungen beim Debuggen erweitern? Wie schlecht ist es, einen Release-Build zu verwenden?Ich stimme Ihrer Schlussfolgerung voll und ganz zu. NuGet-Pakete mit RELEASE und SymbolSource mit Debug. Es scheint ziemlich selten, direkt in Pakete einzusteigen, und gelegentliche Debug-Fehltritte mit aktivierten Optimierungen sind möglicherweise akzeptabel.
Wenn es wirklich ein Problem gäbe, wäre es meiner Meinung nach die ideale Lösung, wenn NuGet es unterstützt. Stellen Sie sich beispielsweise vor, Sie könnten beim Debuggen die Release-DLL durch die im SymbolSource-Paket enthaltene ersetzen.
Im Idealfall würde dann
nuget pack SomePackage -Symbols
gegen eine Release-Version ein Release-Nuget-Paket, aber ein Debug-Symbol-Paket erstellt. Das VS-Plugin wird so aktualisiert, dass es intelligent genug ist, um die Zuordnung zu erkennen und die Debug-Assemblys abzurufen, wenn es in einem Debugger ausgeführt wird, und diese stattdessen zu laden. Ein bisschen verrückt, wäre aber interessant.Ich sehe jedoch nicht genug Leute, die sich darüber beschweren, dass es sich im Moment lohnt.
Das NuGet-Team akzeptiert Pull-Anfragen. :) :)
quelle
Das Beispiel im Erstellen und Veröffentlichen eines Symbolpakets verweist auf Dateien in den Debug-Verzeichnissen als Quellen für die DLL- und PDF-Dateien.
Da der Zweck des Publizierens der Symbole darin besteht, anderen zu ermöglichen, Ihren Code beim Debuggen zu durchlaufen, erscheint es am ratsamsten, eine Version des Codes zu veröffentlichen, die zum Debuggen vorgesehen ist, ohne Optimierungen vorzunehmen, die sich auf den Code auswirken könnten.
quelle