Nuget参照を復元しますか?


182

Visual Studio 2012にソリューションとプロジェクトがあります。

プロジェクトpackages.configのルートにファイルがあります。

この質問のために、これらのライブラリをReferencesプロジェクトのセクションから誤って削除したとしましょう。

NuGetパッケージマネージャーに移動しても、インターフェイスはこれらのパッケージの横にチェックマークを表示し、それらがインストールされていることを示します。

この状況を修正する方法を確認する唯一の方法は、からすべてのエントリを削除することです。これpackages.configにより、NuGetインターフェイスがインストール済みとして報告する問題が修正され、各エントリが再度追加されます。

もっと賢い方法はありますか?私は 'nugetを有効にして不足しているパッケージを復元する'を有効にすることでこれを解決できることを期待していましたが、何も実行しないようです。

回答:


329

パッケージを再インストールしてみてください

NuGetパッケージマネージャーコンソールで、次のコマンドを入力します。

Update-Package -Reinstall -ProjectName Your.Project.Name

パッケージを再インストールしてソリューション全体の参照を復元する場合は、-ProjectNameパラメーターを省略します。


10
リンクの英語翻訳:translate.google.com/...
チャバ・トス

18
注:このコマンドは、コンソールで選択したプロジェクトだけでなく、現在Visual Studioで開いているすべてのプロジェクトの参照を再インストールします。
シンボロ2013年

3
このコマンドは、選択したプロジェクトだけでなく、ソリューション全体のパッケージを再インストールします!
Alex Sorokoletov 2014年

14
非常に危険です!!!! プロセスが中断されると、すべてのパッケージ参照が失われ、ソリューション内のすべてのプロジェクトに1つずつ追加する必要があります。
ビルベラスケス2014

2
@BillVelasquezこのことは私のすべての参照を食べました。まあ、gitの神に感謝します。
グレノ2014

44

43
これにより、NuGetは不足しているパッケージを。\ packages \ディレクトリに再ダウンロードできますが、不足しているプロジェクト参照の復元とは関係がありません。これは、投稿者が求めていたものです。
ブラントボビー

13

これが誰かを助ける場合、私にとって、上記のどれも十分ではありませんでした。私はまだビルドできませんでした、VSはまだリファレンスを見つけることができませんでした。重要なのは、パッケージを復元した後にソリューション閉じて再度開くことでした。

これがシナリオです(Visual Studio 2012を使用)。

パッケージが不足しているソリューションを開きます。リファレンスは、VSがそれらを見つけられないことを示しています。不足しているパッケージを復元する方法たくさんあります。

  • 自動復元に設定されているソリューションの構築
  • パッケージマネージャーコンソールを開き、[復元]ボタンをクリックします。
  • nuget restoreコマンドラインnugetがインストールされている場合に行う

しかし、どのようなアプローチをとっても、それらの参照は依然として欠落として表示されます。ビルドすると失敗します。はぁ。ただし、ソリューションを閉じて再度開くと、VSはこれらのniceを<HintPath>再度チェックし、パッケージが属している場所に戻ったことを確認し、すべてが順調です。

更新

Visual Studioはまだパッケージがあることを認識していませんか?それでも解決できない参照を表示していますか?復元したパッケージのバージョンが<HintPath>.csprojファイルのバージョンと完全に同じであることを確認してください。マイナーなバグ修正番号(1.10.1から1.10.2など)でも、参照が失敗します。これを修正するには、csproj xmlを直接編集するか、または参照を削除して、パッケージディレクトリ内の新しく復元されたバージョンを指す新しい参照を作成します。


1
復元について非常に重要なポイントは、パッケージがパッケージフォルダー(もちろん、多くの場所に存在できる)にあることを確認することだけです。しかし、正しいバージョンのパッケージを使用しても、閉じて再度開くことができなかったため、各csprojファイルのヒントパスを手動で修正する必要がありました。これは、プロジェクトに対してパッケージフォルダーを移動したことが原因であると思います。
ショーン

.csprojファイルを編集して、一致するバージョン番号が機能することを確認しました。ありがとう!
Mateen Ulhaq 2016

11

@jmfenollが提供するソリューションは機能しますが、最新のパッケージに更新されます。私の場合、beta2(プレリリース)をインストールすると、すべてのライブラリがRC1(バグがありました)に更新されました。したがって、上記のソリューションは仕事の半分しか行いません。

私と同じ状況にあり、プロジェクトを、で指定した、または指定したNuGetパッケージの正確なバージョンと同期したい場合はpackages.config、このスクリプトが役立ちます。コピーしてパッケージマネージャーコンソールに貼り付けるだけです

function Sync-References([string]$PackageId) {
  get-project -all | %{
    $proj = $_ ;
    Write-Host $proj.name; 
    get-package -project $proj.name | ? { $_.id -match $PackageId } | % { 
      Write-Host $_.id; 
      uninstall-package -projectname $proj.name -id $_.id -version $_.version -RemoveDependencies -force ;
      install-package -projectname $proj.name -id $_.id -version $_.version
    }
  }
}

そして、次のような具体的なパッケージ名で実行します

Sync-References AutoMapper

またはのようなすべてのパッケージ

Sync-References

クレジットはDan Haywood彼のブログ投稿に送られます。


8

次のスクリプトは、パッケージマネージャーコンソールウィンドウで実行でき、再インストールする前に、ソリューションの各プロジェクトからすべてのパッケージを削除します。

foreach ($project in Get-Project -All) { 
    $packages = Get-Package -ProjectName $project.ProjectName
    foreach ($package in $packages) {
        Uninstall-Package $package.Id -Force -ProjectName $project.ProjectName
    }
    foreach ($package in $packages) {
        Install-Package $package.Id -ProjectName $project.ProjectName -Version $package.Version
    }
}

これにより、すべてのパッケージのインストールスクリプトが再度実行され、不足しているアセンブリ参照が復元されます。残念ながら、ファイルを作成したり、構成を変更したりするなど、スクリプトをインストールすることができる他のすべての作業も再び発生します。クリーンな作業コピーから始めて、SCMツールを使用して、プロジェクトのどの変更を保持し、どれを無視するかを選択する必要があるでしょう。


3

DLLを手動で追加しました。プロジェクトの[参照]を右クリックして[参照の追加]を選択し、ダイアログで[参照]ボタンを押しました。ソリューションのパッケージディレクトリにあるNuGet DLL。それらの名前を取得するには、正常に動作している別のプロジェクトの参照を右クリックし、プロパティを選択して、パスプロパティを調べます。


これが最も簡単な解決策です。パッケージフォルダーを参照するだけで機能します。
Hao Nguyen

2

Visual Studio 2015(Soulutionはソース管理下にあり、MVCプロジェクト)ではcsano Update-Package -Reinstall -ProjectName Your.Project.Nameは機能しましたが、書き込みロックがいくつか混乱しています。

以前は「パッケージ」フォルダを手動で削除する必要がありました。(ソース管理のためロックされているようです)

また、NuGet Package ManagerからMVCパッケージを再インストールする必要がありました。


2

このスクリプトは、依存関係を台無しにしたり、intentianlyzが削除された可能性のある依存関係をインストールしたりせずに、プロジェクトのすべてのパッケージを再インストールします。(パーツパッケージ開発者向けの詳細。)

Update-Package -Reinstall -ProjectName Proteus.Package.LinkedContent -IgnoreDependencies

1

誰かに役立つ場合に備えて-私のシナリオでは、いくつかの共有ライブラリ(独自のTFSプロジェクト/ソリューションがある)がすべて1つのソリューションに結合されています。

Nugetはプロジェクトを正常に復元しますが、DLLがありません。

根本的な問題は、ソリューションに独自のパッケージフォルダーがあり、それらをそのフォルダーに正しく復元している一方で、プロジェクトファイル(.csprojなど)が、パッケージがダウンロードされていない可能性がある別のプロジェクトを参照していることです。テキストエディタでファイルを開き、参照元を確認します。

これは、さまざまな相互リンクされた共有ソリューションでパッケージを管理するときに発生する可能性があります。おそらく、すべてのDLLが同じレベルにあることを確認したいので、これを最上位レベルに設定します。つまり、参照されるDLLに対してまったく異なるソリューションが検索される場合があるため、すべてのプロジェクト/ソリューションをダウンロードして最新の状態にしていない場合、上記の問題が発生する可能性があります。


1

私は@juriに同意する必要があります。jmfenollによる非常に人気のある回答は完全ではありません。壊れた参照の場合には、私はほとんどの時間は、あなたがないことを提出していないに更新する最新のパッケージが、唯一のあなたの参照を修正し、現在使用してすることが起こることをバージョン。そして、ジュリはSync-Referencesそれを行うための便利な機能を提供しました。

しかし、もう少し進んで、プロジェクトとパッケージで柔軟にフィルタリングできるようにします。

function Sync-References([string]$PackageId, [string]$ProjectName) {
    get-project -all | 
    Where-Object { $_.name -match $ProjectName } |
    ForEach-Object {
        $proj = $_ ;
        Write-Output ('Project: ' + $proj.name)
        Get-Package -project $proj.name |
        Where-Object { $_.id -match $PackageId } |
        ForEach-Object { 
            Write-Output ('Package: ' + $_.id)
            uninstall-package -projectname $proj.name -id $_.id -version $_.version -RemoveDependencies -force
            install-package -projectname $proj.name -id $_.id -version $_.version
        }
    }
}

1

欠落した参照で同じ問題が発生しました。私のシナリオの下:

  • 新しいWindows 10マシンとVS Community 2015のインストール
  • TFS経由でリポジトリコードをチェックアウトしました
  • 1つのソリューションは問題なくビルドされ、1つのソリューションには参照が欠落している1つのプロジェクト(EF、System.Httpなど)がありましたが、相対的なnugetパッケージは適切にインストールされました。

プロジェクトとパッケージのすべてのバージョン番号が一致し、(すべての方法で)nuget復元を実行できませんでした。

修正方法:ソリューションルートのパッケージフォルダーを削除し、nuget restoreを実行します。この時点でdllは正しくダウンロードされており、不足している参照用に追加できます。


0

私はこの問題に非常に苦しみました、私の場合、不足しているNuGetをダウンロードすることを確認しました(ただし、それらを復元していません)。

キャッシュをクリアして再構築したところ、うまくいきました。(ツール-オプション-Nugetパッケージマネージャー-全般)

このリンクはhttps://docs.nuget.org/consume/package-restore/migrating-to-automatic-package-restoreにも役立ち ます


0
  1. プロジェクトのpackages.configファイルをコピーし、すべてのバージョンの変更を適用します
  2. すべてのパッケージをアンインストールし、依存関係を削除します

    $packages = Get-Package -ProjectName [nameOfProjectToRestore]
    foreach ($package in $packages) {
        uninstall-package  -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ;
    }
    
  3. プロジェクトのルートにあるパッケージフォルダーをクリアする

  4. 変更したpackage.configをウェブサイトのルートフォルダにコピーします

  5. このコードを実行してプロジェクトを復元します

    $packages = Get-Package -ProjectName [nameOfProjectToRestore]
    foreach ($package in $packages) {
        uninstall-package  -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ;
    }
    foreach ($package in $packages) {
        install-package  $package.Id -ProjectName [nameOfProjectToRestore] -Version $package.Version
    }
    
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.