1. ホーム
  2. visual-studio

[解決済み] Nugetのベストプラクティス。デバッグかリリースか?

2022-12-02 01:16:06

質問

現在、私はリリースビルドを nuget.org への公式ビルドのために Nuget でパッケージしていますが、デバッグビルドを symbolsource.org へのシンボルソースプッシュのために Nuget でパッケージしています。

EDIT: (Jon Skeet、Noda Time開発からのバイアスがかかっています)

NuGet は今回、NuGet gallery の両方へのプッシュをサポートします。 symbolsource.org (または同様のサーバ) の両方へのプッシュをサポートするようになりました。 ドキュメントにあるように . 残念ながら、ここには2つの矛盾した要件があります。

  • ちょうど を使用して を使う場合、本当にリリースビルドが必要です。結局のところ、それがリリース ビルドの目的なのです。
  • 診断目的でライブラリにデバッグを行う場合、適切な最適化をすべて無効にしたデバッグビルドが本当に必要です。結局のところ、デバッグ ビルドはそのためにあるのです。

それは良いことですが、NuGet は (私が知る限り) リリース ビルドとデバッグ ビルドの両方を同じパッケージで有用な方法で公開することを許可していません。

つまり、選択肢は

  • デバッグ ビルドを全員に配布し (ドキュメントの例で示されているように)、サイズとパフォーマンスのヒットに耐える。
  • リリース ビルドを全員に配布し、わずかに損なわれたデバッグ エクスペリエンスと共存する。
  • 本当に複雑な配布ポリシーを採用し、潜在的にリリースとデバッグのパッケージを別々に提供します。

最初の 2 つは、デバッグビルドとリリースビルドの違いの効果に集約されます...しかし、ある動作を確認するためにライブラリのコードに入りたい場合と、バグを見つけたと信じてライブラリのコードをデバッグしたい場合との間には大きな違いがあることは注目に値します。後者の場合、おそらくライブラリのコードを取得する方がよいでしょう。 を Visual Studio ソリューションとして として取得し、その方法でデバッグする方がよいでしょうから、私はその状況をあまり気にしていません。

私の誘惑は、リリース ビルドを続けることで、次のことを期待しています。

比較的

デバッグが必要な人はほとんどいないでしょうし、デバッグが必要な人も な影響を受けることはないでしょう。 多くの の最適化によって影響を受けることはありません。(いずれにせよ、JIT コンパイラーは最適化のほとんどを行います)。

では、私たちが考慮しなかった他のオプションがあるのでしょうか?バランスを崩すような他の考慮事項はありますか? NuGet パッケージを SymbolSource にプッシュすることは、"best practice" が本当に確立されていないほど新しいのでしょうか?

どのように解決するのですか?

OPの投稿から8年経ちましたので(以下、以前の回答がまだ上位にあります)、現在使われているもので解決してみます。

の2つの方法があります。 に踏み込む。 "NuGetパッケージへのステップインです。

1. PDBの配布

.symbols.nupkg シンボルパッケージは レガシーとみなされます。 で置き換えられており .snupkg に公開されるパッケージは シンボルサーバ . ほとんどのベンダでサポートされている Azure DevOps がサポートされている最大のアウトサイダーです。 機能要求 はまだ "under review" となっています (リンクを提供してくれた @alv に感謝します)。

以下は 公式インストラクション . csproj ファイルに以下の2行を追加するだけです。

<PropertyGroup>
  <IncludeSymbols>true</IncludeSymbols>
  <SymbolPackageFormat>snupkg</SymbolPackageFormat>
</PropertyGroup>

消費者側では、IDE が NuGet.org (または Azure など) の Symbol Server に設定されていることを確認してください。 パッケージコードに踏み込む を許可してください。

2. ソースリンク.実際のコードにリンクする

場合によっては、PDBはMSIL/JIT最適化により、ソースコードの一部の仕様を隠してしまうことがあります。そこで、" に踏み込む デバッグ中にNuGetの実際のソースに" "踏み込む方法があります。それは ソースリンク を .NET Foundation から取得します - " バイナリのソースデバッグ体験を提供する、言語やソース管理にとらわれないシステム ".

Visual Studio 15.3+ とすべての主要なベンダーでサポートされています (プライベートレポジトリもサポート)。

設定方法は簡単で、( 公式ドキュメント ) - プロジェクトファイルに、いくつかのフラグと一緒に開発用の依存関係を追加するだけです (あなたのレポの種類に依存します)。

<PropertyGroup>
    <PublishRepositoryUrl>true</PublishRepositoryUrl>
    <EmbedUntrackedSources>true</EmbedUntrackedSources>
</PropertyGroup>
<ItemGroup>
  <PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
</ItemGroup>

このテーマについては、" で詳細を確認してください。 より良いNuGetパッケージのための5つのステップ "をご覧ください。