プロジェクト参照として NuGet と SDK

この記事は、開発者がソフトウェアを NuGet パッケージとしてパッケージ化するか、ソフトウェア開発キット (SDK) としてパッケージ化するかを選択する際に役立つように設計されています。 具体的には、Visual Studio プロジェクトで参照されている場合の 2 つの違いについて説明します。

  • NuGet は、オープン ソースのパッケージ管理システムであり、ライブラリをプロジェクトに組み込むプロセスを簡略化します。 (.NET Core を含む) .NET では、NuGet は、Microsoft がサポートするコード共有メカニズムです。 NuGet では、.NET 用のパッケージを作成、ホスト、使用する方法が定義されており、それらの各ロール用のツールが提供されています。 Visual Studio では、パッケージ マネージャーのユーザー インターフェイスを使用して NuGet パッケージをプロジェクトに追加します。

  • SDK は、Visual Studio で単一の参照項目として取り扱うファイルのコレクションです。 Visual Studio の [参照マネージャー] ダイアログ ボックスには、[参照の追加] を選択したときに、現在のプロジェクトに関連するすべての SDK が一覧表示されます。 SDK をプロジェクトに追加すると、IntelliSense、[ツールボックス] ウィンドウ、デザイナー、[オブジェクト ブラウザー]、MSBuild、デプロイ、デバッグ、パッケージを使用して、その SDK のすべてのコンテンツにアクセスできます。

使用するメカニズムの決定

次の表を使用して、SDK の参照機能と NuGet の参照機能を比較できます。

機能 SDK のサポート対象 SDK に関するメモ NuGet のサポート対象 NuGet に関するメモ
このメカニズムは、1 つのエンティティを参照し、その結果、すべてのファイルと機能が使用できるようになります。 [参照マネージャー] ダイアログ ボックスを使用して SDK を追加し、その結果、開発ワークフローの実行中にすべてのファイルと機能が使用できるようになります。
MSBuild は、アセンブリと Windows メタデータ (.winmd) ファイルを自動的に使用します。 SDK 内の参照は、コンパイラに対して自動的に渡されます。
MSBuild は、.h ファイルまたは .lib ファイルを自動的に使用します。 SDKName.props ファイルは、.h ファイルまたは .lib ファイルを自動的に使用するために Visual C++ のディレクトリなどをセットアップする方法を Visual Studio に伝えます。 N
MSBuild は、.js ファイルまたは .css ファイルを自動的に使用します。 ソリューション エクスプローラーで JavaScript SDK 参照ノードを展開し、個別の .js ファイルまたは .css ファイルを表示した後、それらのファイルをそれぞれのソース ファイルにドラッグすることにより、<source include/> タグを生成できます。 SDK は、F5 キーを使用する方法と自動的なパッケージ設定方法をサポートします。
MSBuild は、[ツールボックス] 内のコントロールを自動的に追加します。 [ツールボックス] は SDK を使用し、指定されたタブの中にコントロールを表示することができます。 N
このメカニズムでは、VSIX (Visual Studio Installer for extensions) をサポートします。 VSIX には、SDK パッケージを作成するための特別なマニフェストとロジックがあります。 VSIX は、別のセットアップ プログラムに埋め込むことができます。
オブジェクト ブラウザーは、参照を列挙します。 オブジェクト ブラウザーは SDK 内にある参照の一覧を自動的に取得し、それらを列挙します。 N
ファイルとリンクは、[参照マネージャー] ダイアログ ボックスに自動的に追加されます (ヘルプへのリンクなどが自動的に設定されます)。 [参照マネージャー] ダイアログ ボックスでは、SDK が自動的に列挙され、ヘルプへのリンクや SDK の依存関係の一覧も表示されます。 N NuGet では独自の [NuGet パッケージの管理] ダイアログ ボックスが表示されます。
このメカニズムでは複数のアーキテクチャがサポートされます。 SDK は、複数の構成で出荷することができます。 MSBuild は、各プロジェクト構成に適したファイルを使用します。 N
このメカニズムでは複数の構成がサポートされます。 SDK は、複数の構成で出荷することができます。 プロジェクトのアーキテクチャに基づいて、MSBuild は各プロジェクト アーキテクチャに適したファイルを使用します。 N
このメカニズムでは、"not to copy" (コピーしない) を指定できます。 ファイルを \redist\designtime どちらのフォルダーにドロップするかに応じて、使用側アプリケーション パッケージにどのファイルをコピーするかを制御できます。 N どのファイルをコピーするかを、パッケージ マニフェスト内で宣言します。
内容は、ローカライズされたファイル内に表示されます。 設計時の操作を向上させるために、SDK 内にあるローカライズされた XML ドキュメントが自動的に含まれます。 N
MSBuild は、SDK の複数バージョンの同時使用をサポートします。 SDK は、複数バージョンの同時使用をサポートします。 N これは参照を行いません。 プロジェクト内で NuGet ファイルの複数のバージョンを一度に使用することはできません。
このメカニズムでは、複数の適切なターゲット フレームワーク、Visual Studio の複数のバージョン、および複数のプロジェクトの種類の指定がサポートされています。 [参照マネージャー] ダイアログ ボックスと [ツールボックス] では、プロジェクトに適用する SDK のみが表示されるため、ユーザーは適切な SDK をより簡単に選択できます。 Y (部分的) Pivot は Target Framework です。 ユーザー インターフェイスに対してフィルター処理は実行されません。 インストール時に、エラーが返される可能性があります。
このメカニズムでは、ネイティブ WinMD に関する登録情報の指定がサポートされています。 SDKManifest.xml 内で、.winmd ファイルと .dll ファイル間の関連付けを指定できます。 N
このメカニズムでは、他の SDK に対する依存関係の指定がサポートされています。 SDK は、ユーザーへの通知のみを実行します。ユーザーは、これらの SDK のインストールと参照を手動で実行する必要があります。 NuGet は取得を自動的に実行し、ユーザーへの通知を行いません。
このメカニズムは、アプリケーション マニフェストや Framework ID のような Microsoft Store の概念と統合されています。 SDK は、Store に固有の概念を渡す必要があります。その結果、パッケージ化機能と、F5 キーを使用する方法は、Store で使用可能な SDK で正常に機能します。 N
このメカニズムは、Windows 8.x Store アプリケーション用のアプリケーション デバッグ パイプラインと統合されています。 SDK は、Store に固有の概念を渡す必要があります。その結果、パッケージ化機能と、F5 キーを使用する方法は、Store で使用可能な SDK で正常に機能します。 NuGet の内容は、プロジェクトの一部になります。 F5 に関して特別な考慮事項は必要ありません。
このメカニズムは、アプリケーション マニフェストに統合されます。 SDK は、Store に固有の概念を渡す必要があります。その結果、パッケージ化機能と、F5 キーを使用する方法は、Store で使用可能な SDK で正常に機能します。 NuGet の内容は、プロジェクトの一部になります。 F5 に関して特別な考慮事項は必要ありません。
このメカニズムは、非参照ファイルを配置します (たとえば、Windows 8.x Store アプリケーションのテストを実行するためのテスト フレームワークを配置します)。 \redist フォルダーにファイルをドロップした場合は、それらのファイルは自動的に配置されます。
このメカニズムは、Visual Studio IDE 内のプラットフォーム SDK を自動的に追加します。 Windows 8 SDK または Windows Phone SDK を特定のレイアウトで特定の位置にドロップすると、その SDK は Visual Studio のすべての機能に自動的に統合されます。 N
このメカニズムでは、開発者のクリーンなコンピューターがサポートされています (つまり、インストールは必要なく、ソース・コード管理からの単純な取得が機能します)。 N SDK を参照するには、ソリューションと SDK を個別にチェックインする必要があります。 MSBuild が SDK を反復処理する、レジストリとは異なる 2 つの既定の場所から SDK をチェックインできます (詳細については、「Creating a Software Development Kit」 (ソフトウェア開発キットの作成) を参照してください)。 代わりに、カスタムの位置に SDK が配置されている場合は、プロジェクト ファイル内で次のコードを指定できます。

<PropertyGroup>
  <SDKReferenceDirectoryRoot>
  C:\MySDKs
  </SDKReferenceDirectoryRoot>
</PropertyGroup>

次に、その場所に SDK をチェックインします。
ソリューションをチェック アウトすることもでき、その場合は Visual Studio が直ちにファイルを認識して、そのファイルを処理します。
パッケージ作成者から成る既存の大規模コミュニティに参加することもできます。 該当なし このコミュニティは新しく作成されたものです。
パッケージ使用者から成る既存の大規模コミュニティに参加することもできます。 該当なし このコミュニティは新しく作成されたものです。
パートナーのエコシステム (カスタム ギャラリー、リポジトリなど) に参加できます。 該当なし 使用可能なリポジトリとしては、Visual Studio Marketplace、Microsoft ダウンロード センター、および Microsoft Store などがあります。
このメカニズムは、パッケージ作成と使用の両方を対象にした、継続的な統合ビルド サーバーに統合されます。 SDK は、チェックインの位置 (SDKReferenceDirectoryRoot プロパティ) をコマンド ラインの一部として MSBuild に渡す必要があります。
このメカニズムでは、安定バージョンとプレリリース パッケージ バージョンの両方がサポートされています。 SDK では、複数のバージョンに対する参照の追加をサポートしています。
このメカニズムでは、インストール済みパッケージの自動更新がサポートされています。 SDK が VSIX として、または Visual Studio の自動更新の一部として提供されている場合は、SDK は自動的な通知を行います。
このメカニズムには、パッケージを作成および使用するためのスタンドアロンの .exe ファイルが含まれています。 SDK には MSBUILD.exe が含まれています。
パッケージは、バージョン管理機能にチェックインできます。 Documents ノードの外部にある場所でチェックインを行うことはできません。つまり、拡張 SDK をチェックインできない可能性があります。 拡張 SDK のサイズは大きい可能性があります。
PowerShell インターフェイスを使用して、パッケージを作成および使用することができます。 Y (使用)、N (作成) SDK を作成するためのツールはありません。 使用するには、コマンド ラインで MSBuild を実行します。
デバッグをサポートするために、シンボル パッケージを使用できます。 .pdb ファイルを SDK 内にドロップすると、そのファイルが自動的に使用されます。
このメカニズムでは、パッケージ マネージャーの自動更新がサポートされています。 該当なし SDK を変更するには、MSBuild を使用します。
このメカニズムでは、軽量のマニフェスト ファイル形式がサポートされています。 SDKManifest.xml では、多くの属性がサポートされていますが、通常必要とされるのは、小規模なサブセットです。
このメカニズムは、Visual Studio のすべてのエディションで使用できます。 SDK ではすべての Visual Studio エディションがサポートされています。 NuGet ではすべての Visual Studio エディションがサポートされています。