Visual Studio に NuGet パッケージを再インストールして更新する

パッケージ参照が Visual Studio プロジェクト内で壊れることがあります。 多くの場合、パッケージの同じバージョンをアンインストールして再インストールすると、参照は復元され動作するようになります。 パッケージを更新すると、更新されたバージョンがインストールされ、問題が解決されることもあります。 この記事では、NuGet パッケージを再インストールおよび更新して、壊れたパッケージ参照と壊れたプロジェクトに対処する方法について説明します。

Note

この記事のガイダンスは、packages.config 管理形式を使用するプロジェクトにのみ適用されます。 PackageReference プロジェクトの場合、復元操作によって壊れた参照が自動的に修正されます。

一般的なシナリオ

Visual Studio プロジェクトでパッケージ参照が壊れる可能性のある一般的なシナリオをいくつか以下に示します。

シナリオ 説明 解像度
パッケージの復元後に参照が壊れた Visual Studio プロジェクトを開いて NuGet パッケージを復元しても、壊れたパッケージ参照が残ります。 参照を修正するには、各パッケージを個別に再インストールしてみてください。
ファイルを削除したためにプロジェクトが壊れた パッケージ ファイルが削除された (見つからない) 場合、プロジェクトが壊れます。 NuGet では、パッケージから追加した項目の削除を妨げません。 パッケージからインストールされたコンテンツを誤って変更し、プロジェクトが壊れてしまう可能性があります。 プロジェクトを復元するには、影響を受けたパッケージを再インストールしてみてください。
パッケージの更新後にプロジェクトが壊れた パッケージを更新すると、プロジェクトが壊れます。 通常、依存関係パッケージをコンパニオンで更新すると、この種類の失敗が発生します。 依存関係の状態を以前の正常動作に復元するには、特定の依存パッケージを再インストールしてみてください。
プロジェクトの再ターゲットまたはアップグレード後に参照が壊れた プロジェクトの再ターゲットまたはアップグレード プロセスにより、パッケージ参照が壊れます。 プロジェクトを再ターゲットすると、NuGet にビルド エラーが表示されます。 ビルド警告には、再インストールが必要になる可能性のあるパッケージが一覧表示されます。 または、プロジェクトをアップグレードした後、NuGet はプロジェクトのアップグレード ログにエラーを表示します。 ログ ファイルには、再インストールが必要になる可能性のあるパッケージが一覧表示されます。 ターゲット フレームワークの変更による issue を解決するには、1 つ以上のパッケージを再インストールしてみてください。
開発中のパッケージ変更 多くの場合、パッケージの作成者は、変更をテストするために、現在開発中のパッケージの同じバージョンを再インストールする必要があります。 Visual Studio の NuGet パッケージ マネージャー コンソールには、パッケージを更新および再インストールするための柔軟なオプションが用意されています。 開発中のパッケージを再インストールするには、Update-Package -reinstall コマンドを使用できます。

実装オプション

NuGet パッケージを更新および再インストールする方法には、いくつかの選択肢があります。 一般的な方法としては、NuGet パッケージ マネージャー UI オプション、NuGet パッケージ マネージャー コンソール、NuGet (コマンド ライン インターフェイス) CLI などがあります。

パッケージ マネージャー UI

パッケージ マネージャー UI には、コンソール インターフェイスに加えて、パッケージをインストール、更新、アンインストールするためのメニュー オプションも用意されています。

  • パッケージを更新するには、[更新] タブを開き、1 つ以上のパッケージを選択してから、[更新] を選択します。

  • パッケージを再インストールするには、まずパッケージをアンインストールしてから、もう一度インストールします。 [インストール済み] タブを開き、パッケージを選択してその名前を記録し、[アンインストール] を選択します。 [参照] タブに切り替え、パッケージ名を検索し、パッケージを選択して、[インストール] を選択します。

パッケージ マネージャー コンソール

[ツール]>[NuGet パッケージ マネージャー]>[パッケージ マネージャー コンソール] から、パッケージ マネージャー コンソールにアクセスできます。

  • パッケージを更新するために、パッケージ マネージャー コンソールに Update-Package コマンドが用意されています。

  • パッケージを再インストールするには、-reinstall パラメーターを指定して同じコマンドを使用できます。 構成と互換性がある場合、このアプローチが最も簡単なオプションです。

詳細については、「Update-Package コマンド」と「パッケージの再インストールに関する考慮事項」セクションをご覧ください。

NuGet CLI

NuGet CLI nuget.exe は、すべての NuGet 機能を提供する Windows 用のコマンド ライン ユーティリティです。

  • インストールされているパッケージを更新するには、nuget update コマンドを実行します。

  • すべての NuGet パッケージを再インストールするには、パッケージ フォルダーを削除してから nuget install コマンドを実行します。

  • 1 つのパッケージを再インストールするには、パッケージ フォルダーを削除し、nuget install <id> コマンドを実行します。<id> 引数は特定のパッケージの ID です。

Note

dotnet CLI では、同様の手順は必要ありません。 dotnet restore コマンドを実行すると、dotnet CLI は NuGet を使用して依存関係を特定し、必要な NuGet パッケージをダウンロードします。 詳細については、「dotnet CLI を使用して NuGet パッケージを復元する」をご覧ください。

アップグレード バージョンの制約

既定では、パッケージを再インストールまたは更新した場合、パッケージ ソースから使用可能な最新バージョンが常にインストールされます。 ただし、packages.config 管理形式を使用するプロジェクトでは、許可される NuGet パッケージのバージョン範囲を明確に制限できます。

パッケージ API の大幅な変更により、アプリケーションがパッケージのバージョン 1.x でのみ動作し、バージョン 2.0 以降では動作しないとします。 アプリケーションを期待どおりに動作させるために、NuGet パッケージのアップグレードをバージョン 1.x のみに制限する必要があります。 この制限は、アプリケーションを破損させる可能性のある偶発的な更新を防ぐのに役立ちます。

制約を設定するには、テキスト エディターで packages.config ファイルを開きます。 制限する依存関係を見つけて、必要なバージョン範囲を含む allowedVersions 属性を追加します。

以下の例は、allowedVersions 属性を [1,2) に設定して、更新をバージョン 1.x に制限する方法を示しています。

<?xml version="1.0" encoding="utf-8"?>
<packages>
    <package id="ExamplePackage" version="1.1.0" allowedVersions="[1,2)" />

    <!-- ... -->
</packages>

いずれの場合も、「Package versioning」(パッケージのバージョン管理) で説明されている表記を使います。

Update-Package コマンド

パッケージ マネージャー コンソールの Update-Package コマンドは、パッケージを再インストールして壊れた参照に対処する最も簡単な方法です。 ただし、この方法はすべてのシナリオで使用できるわけではありません。 このコマンドを使用して、インストールされているパッケージを更新することはできますが、初期インストールを行うことはできません。 構成にまだインストールされていないパッケージを更新または再インストールしようとすると、コマンドはエラーを返します。 コマンドを使用する前に、「パッケージの再インストールに関する考慮事項」セクションを必ず確認してください。

PackageReference を使用してプロジェクトまたはソリューションのパッケージを更新する場合、パッケージは常に最新バージョンに更新されます (リリース前のパッケージは除きます)。 packages.config 管理形式を使用するプロジェクトでは、「アップグレード バージョンの制約」で説明されているように、アップグレード バージョンを制限できます。

以下のセクションでは、コマンドを操作する例を示します。

パッケージ オプションを再インストールする

再インストールを行うコマンドの基本的な使用方法を以下に示します。 特定の NuGet パッケージを識別するには、オプション -Id パラメーターを使用できます。

# Reinstall the package named <package_name>
Update-Package -Id <package_name> –reinstall

Update-Package コマンドを使用する方が、パッケージを削除して、NuGet ギャラリーで同じバージョンの同じパッケージを探すよりも簡単です。

パッケージのオプションを更新する

-reinstall パラメーターを指定しない同じコマンドでは、存在する場合、パッケージがより新しいバージョンに更新されます。 指定したパッケージがまだプロジェクトにインストールされていない場合、コマンドはエラーを返します。

# Update the package named <package_name>
Update-Package <package_name>

プロジェクトとソリューションのオプション

既定では、Update-Package コマンドはソリューション内のすべてのプロジェクトに影響します。 アクションを特定のプロジェクトに制限するには、-ProjectName パラメーターを使用します。 Visual Studio ソリューション エクスプローラーに表示されるプロジェクトの名前を指定します。

以下のコマンドを使用すると、ソリューション内の特定のプロジェクトの NuGet パッケージを再インストールできます。 再インストールする特定の NuGet パッケージの名前は <package_name> パラメーターで指定されます。

# Reinstall the package named <package_name> in MyProject only
Update-Package <package_name> -ProjectName MyProject -reinstall

プロジェクト内のすべてのパッケージを再インストールする場合は、特定のパッケージを指定せずに -ProjectName パラメーターを使用します。 以下の例に示すように、これと同じアプローチに従ってプロジェクト内のパッケージを更新できます。

# Update all packages in MyProject only
Update-Package -ProjectName MyProject

ソリューション内のすべてのパッケージを更新するには、他の引数やパラメーターを指定せずに Update-Package コマンドを単独で使用します。

重要

以下の形式のコマンドを慎重に使用してください。 コマンド プロセスですべての更新を実行するには、かなりの時間がかかる場合があります。

# Update all packages in all projects in the solution
Update-Package 

パッケージの再インストールに関する考慮事項

Update-Package コマンドを使用してパッケージを再インストールする場合は、以下の考慮事項を確認して、構成シナリオとの互換性を確保してください。

  • パッケージとその依存関係は、再ターゲットされたプロジェクトのターゲット フレームワークをサポートしていない可能性があります。
  • requireReinstallation 属性が true に設定されている場合、Visual Studio は影響を受けるパッケージに対してビルド警告を発行します。
  • パッケージとバージョンの制約を再インストールすると、依存関係のバージョン互換性の issue が発生する可能性があります。
  • 特定のパッケージを再インストールすると、依存パッケージが壊れる可能性があります。

パッケージはプロジェクト ターゲット フレームワークをサポートしていません

プロジェクト ターゲット フレームワークを再ターゲットする場合、1 つ以上のパッケージが新しいターゲット構成をサポートしていない可能性があります。

通常、Update-Package –reinstall <package_name> コマンドを使用してパッケージを再インストールすると解決します。 古いターゲット フレームワークに対してインストールされたパッケージはアンインストールされ、同じパッケージがプロジェクトの新しいターゲット フレームワークに対してインストールされます。

場合によっては、パッケージが新しいターゲット フレームワークをサポートしていない可能性があります。 発生する可能性がある問題の一部を以下に示します。

  • パッケージがポータブル クラス ライブラリ (PCL) をサポートしており、そのパッケージでサポートされなくなったプラットフォームの組み合わせにプロジェクトを再ターゲットすると、再インストール後にパッケージへの参照が失われる可能性があります。

  • この問題は、直接使用するパッケージ、または依存関係としてインストールされたパッケージで発生する可能性があります。 直接使用するパッケージは新しいターゲット フレームワークをサポートしている可能性がありますが、その依存関係はサポートしていません。

  • アプリケーションの再ターゲット後にパッケージを再インストールすることによって、ビルド エラーまたはランタイム エラーが発生する場合、ターゲット フレームワークを元に戻すか、新しいターゲット フレームワークを正しくサポートする別のパッケージを探す必要があります。

requireReinstallation 属性を true に設定

プロジェクトのターゲット フレームワークを再ターゲットするか、NuGet パッケージをアップグレードすると、NuGet によってプロジェクトの packages.config ファイルに requireReinstallation 属性が追加される場合があります。 NuGet が再ターゲットまたはアップグレードのプロセス中に影響を受けるパッケージを検出した場合、影響を受けるすべてのパッケージ参照の packages.config ファイルに requireReinstallation="true" 属性が追加されます。 その結果、Visual Studio でプロジェクトをその後ビルドするたびに、それらのパッケージに対するビルド警告が発生します。 警告は、影響を受けるパッケージを再インストールするためのリマインダーとして表示されます。

パッケージの依存関係のバージョン非互換性

Update-Package –reinstall コマンドを使用すると、インストールされているパッケージの同じバージョンと、すべての依存関係の最新バージョンを再インストールできます。 バージョン非互換性の issue に対処するために、バージョン範囲の制約を設定して構成を制御できます。 NuGet は制約に準拠し、issue を解決するために必要な場合にのみ、パッケージの依存関係を新しいバージョンに更新します。

  • パッケージの再インストール中に制約設定によって依存関係が以前のバージョンに戻る場合は、Update-Package <dependency_name> コマンドで issue に対処できます。 このコマンドを使用すると、依存パッケージに影響を与えずに、指定された依存関係を再インストールできます。

  • Update-Package –reinstall <packageName> -ignoreDependencies コマンドを使用することもできます。 このオプションでは、元のパッケージの同じバージョンが再インストールされますが、依存関係は再インストールされません。 パッケージの依存関係を更新すると構成状態が壊れる可能性がある場合は、このアプローチを使用します。

壊れた依存パッケージ

特定のパッケージを再インストールしても、再インストールされたパッケージに依存するインストール済みパッケージは更新されません。 これらの他のインストール済みパッケージのバージョンは変わりません。 その結果、依存関係を再インストールすると、依存パッケージが壊れる可能性があります。