wake-up-neo.com

Wie debugge ich in mein von TeamCity bereitgestelltes Nuget-Paket?

Ich habe eine Bibliothek, die mein Team verwendet, in ein Nuget-Paket, das von TeamCity bereitgestellt wird, in einen Netzwerkordner eingefügt. Ich kann diesen Code jedoch nicht debuggen! SymbolSource ist eine Lösung, über die ich gelesen habe, aber ich würde lieber einen Weg finden, auf die .pdb/source-Dateien direkt von Teamcity zuzugreifen. Weiß jemand, wie das geht? 

Bearbeiten. Wenn ich 'Include Symbols and Source' im Nuget Pack-Erstellungsschritt überprüfe, erstellt TeamCity eine .Symbol.nupkg-Datei zusätzlich zur .nupkg-Datei im Netzwerkordner. Das .Symbol.nupkg enthält die src- und die .pdb-Datei. 

Bearbeiten. Ich habe 'Include Symbols and Source' in TeamCity deaktiviert und der Nuspec-Datei Folgendes hinzugefügt:

  <files>
    <file src="..\MyLibrary\bin\release\MyLibrary.dll" target="lib\net40" />
    <file src="..\MyLibrary\bin\release\MyLibrary.pdb" target="lib\net40" />
    <file src="..\MyLibrary\*.cs" target="src" />
    <file src="..\MyLibrary\**\*.cs" target="src" />
  </files>

Dies fügte der DLL, der PDB und den Quelldateien für meine Bibliothek im Nuget-Paket hinzu und erzeugte keine .Symbols-Datei, die meiner Meinung nach nur für Symbolserver benötigt wird.

63
anthonybell

Zuverlässige leichte Lösung

  1. Legen Sie die PDB in das NuGet-Paket neben der DLL.
  2. Fügen Sie den Debug-Quelldateien den Quellcode für die Lösung hinzu, die auf das Paket verweist.

Dies bedeutet, dass Sie Code durchsehen und Ausnahmen anzeigen können. Möglicherweise müssen Sie jedoch eine Datei auf der Festplatte suchen und öffnen, bevor Sie einen Haltepunkt festlegen können. Natürlich müssen Sie darauf achten, dass sich die Quelle in der richtigen Version befindet.

Weitere Details zu Schritt 1

Wenn Sie derzeit ohne Nuspec verpacken, müssen Sie ein Nuspec erstellen. Fügen Sie dann pdb zur Liste der Dateien im lib-Ordner hinzu. NuGet-Dokumente . Stellen Sie dann sicher, dass der Schritt des Team City Nuget Packs auf Ihre neue Nuspec verweist.

Weitere Details zu Schritt 2

Wenn Sie eine Lösung geöffnet haben, klicken Sie mit der rechten Maustaste auf Lösung, wählen Sie Eigenschaften ... Allgemeine Eigenschaften ... Debug-Quelldateien aus und fügen Sie das Stammquellverzeichnis für die entsprechende binäre Referenz hinzu. Oder lesen Sie MSDN . Beachten Sie, dass Sie die Lösungseigenschaften während des Debugging nicht öffnen können.

In der Zukunft - Source Embedding

In Visual Studio 2017 15.5 preview2 können Sie Ihrer Projektdatei Folgendes hinzufügen:

<PropertyGroup>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <IncludeSymbolsInPackage>true</IncludeSymbolsInPackage>
    <DebugSymbols>true</DebugSymbols>
    <DebugType>portable</DebugType> <!-- Required for EmbedSources -->
    <EmbedSources>true</EmbedSources>
</PropertyGroup>
<ItemGroup>
    <!-- Does the equivalent of EmbedSources in MSBuild (hopefully won't be needed long term) -->
    <Service Include="{508349b6-6b84-4df5-91f0-309beebad82d}" />
</ItemGroup>

Für diese Methode ist es noch früh, und es gibt wahrscheinlich ein paar Einschränkungen, siehe diesen Kommentar und verwandte Diskussionen, um mehr zu erfahren.

67
Graham

Die neueste Version von dotPeek (kostenlos!) Kann als Symbol-Server fungieren und pdb-Dateien im laufenden Betrieb generieren. Dies hat mir erlaubt, in die DLLs zu debuggen, die über Teamcity bereitgestellt werden. 

Hier herunterladen:

http://blog.jetbrains.com/dotnet/2014/04/09/introducing-dotpeek-1-2-early-access-program/

Anweisungen zum Einrichten hier.

https://web.archive.org/web/20160220163146/http://confluence.jetbrains.com/display/NETCOM/dotPeek+Symbol+Server+und+PDB+Generation

29
anthonybell

Sie können natürlich Ihren eigenen Symbol-Server einrichten und konfigurieren , aber es ist wahrscheinlich am einfachsten zu ...

  1. inedo herunterladen/installieren ProGet
  2. aktivieren Sie das Symbol, das auf dem Ziel-Feed angezeigt wird
  3. veröffentlichen Sie Pakete von TeamCity in den ProGet-Feed
  4. verwenden Sie ProGet als primäre Feedquelle (da es mehrere Feeds einschließlich nuget.org zusammenfassen kann)

All dies kann mit der kostenlosen Edition von ProGet durchgeführt werden.


disclaimer - mein tagesjob ist bei inedo

8
Karl Harnagy

In Ihrem .nuspec (direkt unter <package>):

<files>
  <file src="bin\$configuration$\$id$.pdb" target="lib\net451\" />
</files>

(net451 in die Plattform ändern, für die Sie kompilieren)

6
user3638471

Ich habe einen super einfachen Weg gefunden, über den ich hier gebloggt habe:

https://mattfrear.com/2017/11/29/speed-up-entwicklung-in-a-nuget-package-centric-solution/

Dies funktioniert nur, wenn Sie den neuen .NET Core-Stil .csproj mit <PackageReference> verwenden (entweder in .NET Core oder .NET Framework).

Dies setzt wiederum voraus, dass Sie Zugriff auf den Quellcode des NuGet-Pakets haben.

  1. Erstellen und kompilieren Sie das NuGet-Paket auf Ihrem lokalen Computer
  2. Kopieren Sie die gerade kompilierte .dll-Datei in Ihren local-Feed-Ordner für NuGet-Pakete (Auf meinem Rechner ist dies C:\Users\matt\.nuget\packages\) und überschreibt die vorhandene NuGet-Paket-.dll. 

Das ist es! Sie sollten während des Debugging in das Paket einsteigen können. Kein Durcheinander mit .pdbs oder Quellservern. Dies hat meinen Entwicklungszyklus enorm beschleunigt.

2
Matt Frear

Wenn Sie den Quellcode für das Paket haben, lautet die narrensichere (aber möglicherweise umständliche) Methode:

  1. Fügen Sie den Quellcode für das Paket Ihrer Lösung hinzu (klicken Sie mit der rechten Maustaste auf Lösung -> Vorhandenes Projekt hinzufügen).
  2. Durchsuchen Sie alle Ihre Projekte in der Projektmappe und entfernen Sie den NuGet-Verweis auf die Bibliothek (d. H. Öffnen Sie den Ordner "Referenzen" unter jedem Projekt und löschen Sie den Verweis auf das Paket.) Fügen Sie dann einen Verweis auf das NuGet-Paketprojekt in Ihrer Projektmappe hinzu. (Klicken Sie mit der rechten Maustaste auf Verweise, fügen Sie Verweis hinzu, wählen Sie Projekte und aktivieren Sie das Kontrollkästchen für das Projekt.)

Ich musste es auf diese Weise tun, als die Methode, die ich im NuGet-Paket debuggen wollte, vom Framework und nicht von meinem Code aufgerufen wurde. Daher konnte ich nicht darauf eingehen. (In meinem Fall war die Methode ein ASP.NET DelegatingHandler).

Wenn Sie fertig sind, möchten Sie alle Änderungen über die Quellcodeverwaltung rückgängig machen, damit das NuGet-Paket korrekt referenziert wird.

2
Matt Frear

Da diese Frage ursprünglich veröffentlicht wurde, hat Jetbrains einen ganzen Blogeintrag geschrieben, wie dies zu erreichen ist. Die Schritte können wie folgt zusammengefasst werden:

  • Installieren Sie Debugging-Tools für Windows auf den Agenten.
  • Installieren Sie das Symbol Server Plugin .
  • Fügen Sie den Build-Konfigurationen Symbol-Indexerstellungsfunktion hinzu.
  • Stellen Sie sicher, dass PDB-Dateien als Artefakt ausgegeben werden.
  • Konfigurieren Sie Visual Studio so, dass TeamCity als Quellserver verwendet wird.

Wenn Sie Nuget Package-Erstellungsschritte verwenden, können Sie das Kontrollkästchen "Symbole und Quelle einschließen" aktivieren, um einen .symbol.nupkg auszugeben, der die PDBs enthält. Je nachdem, ob der Symbol Files Indexer intelligent genug ist, um in diese Datei zu blicken oder nicht, müssen Sie möglicherweise die Dateierweiterung ändern, damit alles funktioniert.

Die vollständigen Details finden Sie hier: https://blog.jetbrains.com/teamcity/2015/02/setting-up-teamcity-as-symbol-und-source-server/

2
Schneider

Das ist, was ich gefunden habe, um zu arbeiten, aber alle Schritte sind wahrscheinlich nicht erforderlich ...

Hinweis: Dies erlaubt Ihnen nicht, beide zu debuggen, nur entweder das Nuget Paket oder die Lösung, in der es installiert ist.

  1. Führen Sie Visual Studio als Administrator aus
  2. Öffnen und starten Sie die Host-Anwendung (in der Sie das Nuget-Paket installiert haben) ohne Debuggen (Strg + F5)
  3. Stellen Sie in der Nuget-Paketlösung sicher, dass Tools > Options > Debugging > General > "Require source files to exactly match the original version"NICHT markiert ist.
  4. Stellen Sie sicher, dass "Enable just my code"NICHT markiert ist
  5. Fügen Sie in Tools > Options > Debugging > Symbols einen neuen Ordner hinzu, der auf das Quellverzeichnis des Nuget-Pakets verweist. (Sie geben den Ordnerpfad buchstäblich ein, siehe Abbildung unten.)
  6. Klicken Sie auf Debug > Attach to Process...
  7. Finde iisexpress (es kann mehrere geben, es schadet nicht allen)

 Screenshot of Symbol Source Locations

2
hofnarwillie

Wenn sich Ihr Code in einem öffentlichen Git-Repository befindet oder zumindest in Ihrem Netzwerk ohne Authentifizierung zugänglich ist, wäre GitLink eine Option:

https://github.com/GitTools/GitLink

GitLink macht Symbolserver obsolet, indem die PDB so geändert wird, dass sie auf den Git-Server verweist. Wie bereits erwähnt, ist es daher notwendig, dass das Git-Repository öffentlich ist. Bis jetzt gibt es keine "richtige" Methode zur Authentifizierung, wenn auf ein privates Repository zugegriffen wird.

0