Visual Studio 2017 バージョン 15.7 以降では、 packages.config 管理形式から PackageReference 形式へのプロジェクトの移行がサポートされています。
PackageReference を使用する利点
-
すべてのプロジェクト依存関係を 1 か所で管理します。プロジェクトからプロジェクトへの参照やアセンブリ参照と同様に、NuGet パッケージ参照 (
PackageReferenceノードを使用) は、別の packages.config ファイルを使用するのではなく、プロジェクト ファイル内で直接管理されます。 - 最上位の依存関係の整理されていないビュー: packages.configとは異なり、PackageReference には、プロジェクトに直接インストールした NuGet パッケージのみが一覧表示されます。 その結果、NuGet パッケージ マネージャー UI とプロジェクト ファイルが下位レベルの依存関係で乱雑になりません。
-
パフォーマンスの向上: PackageReference を使用すると、パッケージはグローバル パッケージ フォルダーに保持されます (ソリューション内の フォルダーではなく
packagesに関するページで説明されています)。 その結果、PackageReference のパフォーマンスが向上し、使用するディスク領域が少なくなります。 - 依存関係とコンテンツ フローを細かく制御する: MSBuild の既存の機能を使用すると、 NuGet パッケージを条件付きで参照 し、ターゲット フレームワーク、構成、プラットフォーム、またはその他のピボットごとにパッケージ参照を選択できます。
制限事項
- NuGet PackageReference は、Visual Studio 2015 以前では使用できません。 移行されたプロジェクトは、Visual Studio 2017 以降でのみ開くことができます。
- 現在、C++ および ASP.NET プロジェクトでは移行を使用できません。
- 一部のパッケージは PackageReference と完全に互換性がない場合があります。 詳細については、「 パッケージの互換性の問題」を参照してください。
さらに、PackageReferences の動作は、packages.configと比較していくつかの違いがあります。たとえば、 アップグレード バージョンの制約 は PackageReference ではサポートされていませんが、PackageReference では フローティング バージョンのサポートが追加されます。
既知の問題
-
Migrate packages.config to PackageReference...オプションは、右クリック コンテキスト メニューでは使用できません
問題点
プロジェクトが最初に開かれると、NuGet 操作が実行されるまで NuGet が初期化されていない可能性があります。 これにより、 packages.config または Referencesの右クリック コンテキスト メニューに移行オプションが表示されなくなります。
対処法
次のいずれかの NuGet アクションを実行します。
- パッケージ マネージャー UI を開く -
Referencesを右クリックして、Manage NuGet Packages...を選択します。 - パッケージ マネージャー コンソールを開くには、
Tools > NuGet Package ManagerからPackage Manager Consoleを選択します。 - NuGet の復元を実行する - ソリューション エクスプローラーでソリューション ノードを右クリックし、
Restore NuGet Packages - NuGet の復元もトリガーするプロジェクトをビルドする
これで、移行オプションが表示されます。 このオプションはサポートされておらず、ASP.NET および C++ プロジェクトの種類には表示されないことに注意してください。
移行の手順
注
移行を開始する前に、Visual Studio によってプロジェクトのバックアップが作成され、必要に応じて packages.configにロールバック できるようになります。
packages.configを使用して、プロジェクトを含むソリューションを開きます。ソリューション エクスプローラーで、[参照] ノードまたは
packages.configファイルを右クリックし、[packages.config を PackageReference に移行...] を選択します。移行ツールは、プロジェクトの NuGet パッケージ参照を分析し、それらを 最上位の依存関係 (直接インストールした NuGet パッケージ) と 推移的な依存関係 (最上位パッケージの依存関係としてインストールされたパッケージ) に分類しようとします。
注
PackageReference は推移的なパッケージの復元をサポートし、依存関係を動的に解決します。つまり、推移的な依存関係を明示的にインストールする必要はありません。
(省略可能)パッケージの 最上位 オプションを選択することで、推移的な依存関係として分類された NuGet パッケージを最上位の依存関係として扱うことを選択できます。 このオプションは、推移的にフローしないアセット (
build、buildCrossTargeting、contentFiles、またはanalyzersフォルダー内のもの) と、開発依存関係としてマークされたパッケージ (developmentDependency = "true") を含むパッケージに対して自動的に設定されます。パッケージの互換性の問題を確認します。
[ OK] を 選択して移行を開始します。
移行の最後に、Visual Studio は、バックアップへのパス、インストールされているパッケージの一覧 (最上位レベルの依存関係)、推移的な依存関係として参照されるパッケージの一覧、および移行の開始時に特定された互換性の問題の一覧を含むレポートを提供します。 レポートはバックアップ フォルダーに保存されます。
ソリューションがビルドされて実行されることを検証します。 問題が発生した場合は、 GitHub で問題を報告してください。
packages.config にロールバックする方法
移行したプロジェクトを閉じます。
プロジェクト ファイルと
packages.configをバックアップ (通常は<solution_root>\MigrationBackup\<unique_guid>\<project_name>\) からプロジェクト フォルダーにコピーします。 プロジェクトのルート ディレクトリに obj フォルダーが存在する場合は削除します。プロジェクトを開きます。
[ ツール] > [NuGet パッケージ マネージャー] > [パッケージ マネージャー コンソール ] メニュー コマンドを使用して、パッケージ マネージャー コンソールを開きます。
コンソールで次のコマンドを実行します。
update-package -reinstall
移行後にパッケージを作成する
移行が完了したら、 .nuspec ファイルから MSBuild プロパティにパッケージ メタデータをコピーし、 msbuild -t:pack を使用してパッケージを作成することをお勧めします。
Visual Studio 2022 以前を使用している場合は、NuGet.Build.Tasks.Pack パッケージもインストールする必要があります。
Visual Studio 2026 から、パックは MSBuild に組み込まれています。
パッケージの互換性の問題
packages.config でサポートされていた一部の側面は、PackageReference ではサポートされていません。 移行ツールは、このような問題を分析して検出します。 次の 1 つ以上の問題があるパッケージは、移行後に期待どおりに動作しない可能性があります。
"install.ps1" スクリプトは、移行後にパッケージがインストールされるときに無視されます
説明: PackageReference では、パッケージのインストール中またはアンインストール中に、install.ps1 および uninstall.ps1 PowerShell スクリプトは実行されません。
潜在的な影響: コピー先プロジェクトで動作を構成するためにこれらのスクリプトに依存するパッケージが、想定どおりに動作しない可能性があります。
移行後にパッケージがインストールされている場合、"コンテンツ" アセットは使用できません
説明: パッケージの
contentフォルダー内のアセットは PackageReference ではサポートされず、無視されます。 PackageReference では、contentFilesのサポートが追加され、推移的なサポートと共有コンテンツが向上します。潜在的な影響:
content内の資産はプロジェクトにコピーされず、それらの資産の存在に依存するプロジェクト コードにはリファクタリングが必要です。
アップグレード後にパッケージがインストールされるときに XDT 変換が適用されない
説明: パッケージのインストールまたはアンインストール時に、XDT 変換は PackageReference ではサポートされず、
.xdtファイルは無視されます。潜在的な影響: XDT 変換はプロジェクト XML ファイルには適用されません。最も一般的には、
web.config.install.xdtとweb.config.uninstall.xdt。つまり、パッケージのインストールまたはアンインストール時にプロジェクトのweb.configファイルが更新されません。
移行後にパッケージがインストールされると、lib ルート内のアセンブリは無視されます
説明: PackageReference では、ターゲット フレームワーク固有のサブフォルダーがない
libフォルダーのルートにあるアセンブリは無視されます。 NuGet は、プロジェクトのターゲット フレームワークに対応するターゲット フレームワーク モニカー (TFM) に一致するサブフォルダーを検索し、一致するアセンブリをプロジェクトにインストールします。潜在的な影響: プロジェクトのターゲット フレームワークに対応するターゲット フレームワーク モニカー (TFM) と一致するサブフォルダーがないパッケージは、移行後に予期したとおりに動作しないか、移行中にインストールが失敗する可能性があります。
問題が見つかりましたか? 報告してください。
移行エクスペリエンスに問題が発生した場合は、 NuGet GitHub リポジトリに問題を報告してください。