web-dev-qa-db-ja.com

Nugetのベストプラクティス:デバッグまたはリリース?

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

編集:(Jon Skeet、野田タイムの開発からのいくらかのバイアス)

NuGetは、NuGetギャラリーsymbolsource.org(または同様のサーバー)、 の両方へのプッシュをサポートしています 。残念ながら、ここには2つの矛盾する要件があります。

  • デバッグする必要のないライブラリをusingだけで使用する場合、本当にリリースビルドが必要です。結局、リリースビルドの目的です。
  • 診断目的でライブラリをデバッグする場合は、適切な最適化をすべて無効にしてデバッグビルドを作成する必要があります。結局、デバッグビルドの目的です。

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

そのため、選択肢は次のとおりです。

  • デバッグビルドを全員に配布し(ドキュメントの例に示されているように)、あらゆるサイズとパフォーマンスのヒットに耐えます。
  • リリースビルドを全員に配布し、わずかに障害のあるデバッグエクスペリエンスで生活します。
  • 個別のリリースパッケージとデバッグパッケージを提供する可能性がある、非常に複雑な配布ポリシーを選択してください。

最初の2つは、デバッグビルドとリリースビルドの違いの効果を実際に要約しています...ただし、動作を確認するためにライブラリのコードにステップインすることと、バグを発見したと思われるため、ライブラリのコードをデバッグします。 2番目のケースでは、おそらくライブラリのコードをVisual Studioソリューションとして取得し、その方法でデバッグする方がよいので、あまりお金をかけませんその状況に注意してください。

比較的少数の人々がデバッグする必要があり、そうしない人々はデバッグすることを期待して、リリースビルドを維持するだけですリリースビルドの最適化の影響much。 (とにかくJITコンパイラーはほとんどの最適化を行います。)

それで、考慮していなかった他のオプションはありますか?バランスを崩す他の考慮事項はありますか? NuGetパッケージをSymbolSourceにプッシュすることは、「ベストプラクティス」が実際に確立されていないほど十分に新しいですか?

83
gzak

SymbolSourceについて言えば、ベストプラクティスは次のとおりであると考えています。

  1. リリースバイナリ+コンテンツパッケージをnuget.orgのみ(またはその他の本番フィード)にプッシュします
  2. デバッグバイナリ+コンテンツパッケージを開発フィードにプッシュします:
    • 敷地内に
    • myget.orgで
    • nuget.orgでプレリリースパッケージとして。
  3. リリースおよびデバッグバイナリ+シンボルパッケージの両方をsymbolsource.orgまたは他のシンボルストアにプッシュします。

私たちが取り組んでいる間、.NETのリリースビルドとデバッグビルドは実際には大きく異なるというのはよくある誤解ですが、デバッグのように、いずれかのビルドに含まれる場合と含まれない場合のあるさまざまなコードのために差別化がここにあると仮定していますアサート。

とはいえ、両方の構成をSymbolSourceにプッシュすることは本当に価値があります。実稼働コードのデバッグが必要になる時期がわからないからです。本番環境でリモートで実行し、より難しくします。その場合は、ツールから得られるヘルプが必要になります。これは明らかに誰にも望まない。

バージョン管理に関して考慮すべき事項がまだあります。1つのバージョン番号を共有する2つの異なるパッケージ(デバッグとリリースでビルド)を持つことは正しいですか? SymbolSourceは、パッケージを抽出し、バイナリを個別のビルドモードブランチに格納するため、NuGetのみがそれに応じてパッケージにタグを付けることができる場合、それを受け入れます。現在、パッケージがデバッグモードかリリースモードかを判断する方法はありません。

27
TripleEmcoder

私はあなたの結論に完全に同意します。リリース付きのNuGetパッケージとデバッグ付きのSymbolSource。パッケージに直接足を踏み入れるのは非常にまれであり、最適化を有効にした状態でのデバッグの失敗は許容できる場合があります。

本当に問題があった場合、NuGetがそれをサポートすることが理想的な解決策だと思います。たとえば、デバッグ時にリリースDLLをSymbolSourceパッケージに含まれているものに置き換えることができる場合を想像してください。

理想的には、そのとき何が起こるかはnuget pack SomePackage -Symbolsリリースバージョンに対しては、リリースナゲットパッケージが作成されますが、デバッグシンボルパッケージは作成されます。 VSプラグインは、関連付けを確認し、デバッガーで実行しているときにデバッグアセンブリをプルし、代わりにそれらを読み込むのに十分スマートになるように更新されます。ちょっとクレイジーですが、面白いでしょう。

ただし、これについて不満を言う人があまりいないので、現時点では価値があるでしょう。

NuGetチームはプルリクエストを受け入れます。 :)

4
Haacked

シンボルパッケージの作成と公開 の例は、dllおよびpdbファイルのソースとしてデバッグディレクトリ内のファイルを参照します。

シンボルパッケージの内容の指定

シンボルパッケージは、前のセクションで説明した方法で構造化されたフォルダーから、慣例により構築できます。または、その内容は、filesセクションを使用して指定できます。前述のサンプルパッケージをビルドする場合は、これをnuspecファイルに追加できます。

<files>
  <file src="Full\bin\Debug\*.dll" target="lib\net40" /> 
  <file src="Full\bin\Debug\*.pdb" target="lib\net40" /> 
  <file src="Silverlight\bin\Debug\*.dll" target="lib\sl40" /> 
  <file src="Silverlight\bin\Debug\*.pdb" target="lib\sl40" /> 
  <file src="**\*.cs" target="src" />
</files>

シンボルを公開する目的は、デバッグ時に他の人がコードをステップスルーできるようにすることなので、コードのステップスルーに影響を与える可能性のある最適化なしで、デバッグ用のコードのバージョンを公開するのが最も賢明です。

1
tvanfosson