web-dev-qa-db-ja.com

TeamCityからデプロイされたnugetパッケージにデバッグする方法は?

チームが使用するライブラリを、TeamCityからネットワークフォルダーに展開されるnugetパッケージに入れました。ただし、このコードをデバッグすることはできません! SymbolSourceは私が読んだ1つのソリューションですが、Teamcityから直接.pdb/sourceファイルにアクセスする方法を見つけたいと思います。誰もこれを行う方法を知っていますか?

編集チェックすると'Include Symbols and Source' Nuget Packビルドステップで、TeamCityはネットワークフォルダーに.nupkgファイルに加えて.Symbol.nupkgを作成します。 .Symbol.nupkgには、srcおよび.pdbファイルが含まれています。

編集未チェック'Include Symbols and Source'をTeamCityに追加し、nuspecファイルに次を追加しました。

  <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>

これにより、dll、pdb、およびライブラリのソースファイルがnugetパッケージに追加され、シンボルサーバーにのみ必要と思われる.Symbolsファイルは生成されませんでした。

66
anthonybell

信頼できる軽量ソリューション

  1. DllとともにNuGetパッケージにpdbを配置します。
  2. パッケージを参照するソリューションのデバッグソースファイルにソースコードを追加します。

つまり、コードをステップ実行して例外を表示できますが、ブレークポイントを設定する前にディスク上のファイルを見つけて開く必要がある場合があります。明らかに、ソースが正しいリビジョンであることに注意する必要があります。

ステップ1の詳細

現在、Nuspecを使用せずにパッケージ化する場合は、Nuspecを作成し、libフォルダー内のファイルのリストにpdbを追加する必要があります。「NuGet spec」は、 NuGet docs 。次に、Team City Nuget Packステップが新しいnuspecを参照していることを確認します。

ステップ2の詳細

ソリューションを開いたら、[ソリューション]を右クリックし、[プロパティ...共通プロパティ...デバッグソースファイル]を選択して、関連するバイナリリファレンスのルートソースディレクトリを追加します。または [〜#〜] msdn [〜#〜] を参照してください。デバッグ中にソリューションプロパティを開くことはできません。

将来的に-ソースの埋め込み

Visual Studio 2017 15.5 preview2から、次のようなものをプロジェクトファイルに追加できます。

<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>

この方法はまだ初期の段階であり、おそらくその使用にはいくつかの注意事項があります。詳細については このコメント の下部と関連する議論を参照してください。

68
Graham

DotPeekの最新バージョン(無料!)は、シンボルサーバーとして機能し、その場でpdbファイルを生成できます。これにより、teamcity経由で提供されるdllをデバッグできました。

ここからダウンロードしてください:

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

ここで設定する方法の説明。

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

29
anthonybell

もちろん 独自のシンボルサーバーを設定および構成する が可能ですが、おそらく最も簡単です...

  1. inedoの ProGet をダウンロードしてインストールします
  2. ターゲットフィードでシンボル配信を有効にする
  3. teamCityからProGetフィードにパッケージを公開する
  4. proGetをプライマリフィードソースとして使用します(nuget.orgを含む複数のフィードを集約できるため)

これらはすべて、ProGetの無料版で実行できます。


免責事項-私の仕事は Inedo

8
Karl Harnagy

.nuspec<package>の直下):

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

net451をコンパイルするプラットフォームに変更します)

6
user3638471

これを行う非常に簡単な方法を見つけました。これについては、ここでブログに書いています:

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

これは、新しい.NET Coreスタイルの.csprojを<PackageReference>(.NET Coreまたは.NET Frameworkのいずれか)と共に使用している場合にのみ機能します。

これも、NuGetパッケージのソースコードにアクセスできることを前提としています。

  1. ローカルマシンでNuGetパッケージをビルドおよびコンパイルします
  2. コンパイルした.dllをローカルNuGetパッケージフィードフォルダーにコピーします(私のマシンでは、これはC:\Users\matt\.nuget\packages\です)、上書きします既存のNuGetパッケージ.dll。

それでおしまい!デバッグ中にパッケージにステップインできるはずです。 .pdbsまたはソースサーバーをいじることはありません。これにより、開発サイクルが大幅に短縮されました。

4
Matt Frear

パッケージのソースコードがある場合、絶対確実な(ただし面倒な)メソッドは次のとおりです。

  1. パッケージのソースコードをソリューションに追加します([ソリューション]-> [既存プロジェクトの追加]を右クリックします)
  2. ソリューション内のすべてのプロジェクトを調べて、ライブラリへのNuGet参照を削除します(つまり、各プロジェクトの下のReferencesフォルダーを開き、パッケージへの参照を削除します)。次に、ソリューションにNuGetパッケージプロジェクトへの参照を追加します。 (つまり、参照を右クリックして参照を追加し、プロジェクトを選択してプロジェクトのボックスにチェックを付けます)

NuGetパッケージ内でデバッグしたいメソッドが、コードではなくフレームワークによって呼び出されたため、この方法でそれを行う必要があったため、それに踏み込むことができませんでした。 (私の場合、メソッドはASP.NET DelegatingHandlerでした)。

完了したら、NuGetパッケージが正しく参照されるように、ソース管理を介してすべての変更を元に戻します。

2
Matt Frear

この質問はもともと投稿されていたため、Jetbrainsはこれを達成する方法に関するブログ投稿全体を書いています。手順は次のように要約できます。

  • エージェントに Windows用デバッグツール をインストールします。
  • Symbol Serverプラグイン をインストールして有効にします。
  • シンボルファイルインデクサーのビルド機能をビルド構成に追加します。
  • PDBファイルがアーティファクトとして出力されるようにします。
  • ソースサーバーとしてTeamCityを使用するようにVisual Studioを構成します。

Nuget Packageのビルド手順を使用している場合は、[シンボルとソースを含める]をオンにして.symbol.nupkgこれにはPDBが含まれます。 Symbol Files Indexerがこのファイルの内部を見るのに十分スマートであるかどうかに応じて、機能するようにファイル拡張子を変更する必要があります。

詳細については、こちらをご覧ください: https://blog.jetbrains.com/teamcity/2015/02/setting-up-teamcity-as-symbol-and-source-server/

2
Schneider

これは私が働いていることがわかったものですが、すべてのステップはおそらく必要ではありません...

注意:これは両方をデバッグすることを許可しません。nugetパッケージまたはそれがインストールされているソリューションのいずれかのみをデバッグします。

  1. Visual Studioを管理者として実行する
  2. ホストアプリケーション(Nugetパッケージをインストールしたアプリケーション)を開いて起動しますデバッグなし(Ctrl + F5)
  3. Nugetパッケージソリューションで、Tools > Options > Debugging > General > "Require source files to exactly match the original version"[〜#〜] not [〜#〜]にチェックされていることを確認します。
  4. "Enable just my code"[〜#〜] not [〜#〜]になっていることを確認してください
  5. Nugetパッケージのソースディレクトリを指すTools > Options > Debugging > Symbolsに新しいフォルダーを追加します。 (あなたは文字通りフォルダパスを入力します、下の画像を参照)
  6. Debug > Attach to Process...をクリックします
  7. iisexpressを見つけます(複数ある場合がありますが、すべてに害を及ぼすことはありません)

Screenshot of Symbol Source Locations

2
hofnarwillie

コードがパブリックGitリポジトリにある場合、または少なくともネットワーク内で認証なしでアクセスできる場合、GitLinkはオプションになります。

https://github.com/GitTools/GitLink

GitLinkは、Gitサーバーを指すようにPDBを変更することにより、シンボルサーバーを廃止します。しかし、前述のように、これによりGitリポジトリがパブリックであることが必要になります。これまでは、プライベートリポジトリにアクセスするときに「適切な」認証方法がありませんでした。

0