web-dev-qa-db-ja.com

Nuget参照の復元?

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

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

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

NuGetパッケージマネージャーに入ると、インターフェイスはこれらのパッケージの横にあるチェックマークをまだ報告しており、インストールされていることを示しています。

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

もっと賢い方法はありますか? 「nugetを有効にして見つからないパッケージを復元する」を有効にすると解決することを期待していましたが、何もしないようです。

176
maxp

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

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

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

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

325
jmfenoll

VSソリューションレベルでNuGetパッケージの復元を有効にする 不足しているパッケージの復元を機能させる必要があります。

enter image description here

44
Gan

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

シナリオは次のとおりです(Visual Studio 2012を使用):

パッケージが欠落しているソリューションを開きます。参照は、VSがそれらを見つけることができないことを示しています。欠落しているパッケージを復元する 多くの方法 があります。

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

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

更新

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

13
John Hatton

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

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

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および 彼のブログ投稿 に移動します。

10
Juri

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

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
    }
}

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

8
Brant Bobby

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

3
Mark Horgan

このスクリプトは、依存関係を混乱させたり、意図的に削除された依存関係をインストールしたりすることなく、プロジェクトのすべてのパッケージを再インストールします。 (一部のパッケージ開発者向けの詳細。)

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

Visual Studio 2015(Soulutionはソース管理下、MVC-Project)では、csanoのUpdate-Package -Reinstall -ProjectName Your.Project.Nameは機能しましたが、書き込みロックが台無しになりました。

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

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

2
Yves

私は、jmfenollによる非常に人気のある回答が完全ではないことを@Juriに同意する必要があります。破損した参照の場合、ほとんどの場合、notlatestパッケージに更新したい、ただし、使用しているcurrentバージョンへの参照のみを修正してください。そして、Juriはそれを行うための便利な関数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
Michael Sorens

参照が見つからないという同じ問題がありました。私のシナリオの下:

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

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

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

1
Francesco

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

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

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

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

1
McGaz

私はこの問題に非常に苦しみました。私の場合、欠落しているNuGetのダウンロードがチェックされましたが(復元されていません)、インストールされたパッケージの一部を変更したため、アンインストールおよび再インストールできません...

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

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

0
Mamdouh
  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をWebサイトのルートフォルダーにコピーします

  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
    }
    
0
Lluthus