Memulihkan Referensi Nuget?


182

Saya punya solusi & proyek di Visual Studio 2012.

Proyek memiliki file packages.configdi root proyek.

Untuk keperluan pertanyaan ini, anggaplah saya secara tidak sengaja menghapus perpustakaan ini dari Referencesbagian proyek saya.

Saat masuk ke manajer paket NuGet, antarmuka masih melaporkan tanda centang di sebelah paket-paket ini, menunjukkan mereka diinstal.

Satu-satunya cara saya dapat melihat cara memperbaiki situasi ini adalah dengan menghapus semua entri dari packages.config, yang akan memperbaiki masalah antarmuka NuGet yang melaporkannya sebagai terinstal, dan menambahkan kembali masing-masing.

Apakah ada cara yang lebih pintar? Saya berharap mengaktifkan 'enable nuget untuk mengembalikan paket yang hilang' akan menyelesaikan masalah ini, tetapi sepertinya tidak melakukan apa-apa.

Jawaban:


329

Coba instal ulang paket .

Di Konsol Manajer Paket NuGet masukkan perintah berikut:

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

Jika Anda ingin menginstal ulang paket dan mengembalikan referensi untuk seluruh solusi, abaikan -ProjectNameparameternya.


10
Terjemahan bahasa Inggris dari tautan: translate.google.com/...
Csaba Toth

18
Catatan: Perintah ini akan menginstal ulang referensi pada semua proyek yang saat ini terbuka di Visual Studio, bukan hanya proyek yang dipilih di konsol.
simbolo

3
Perintah ini akan menginstal ulang paket di seluruh solusi, tidak hanya di proyek yang dipilih!
Alex Sorokoletov

14
Sangat Berbahaya !!!! Jika prosesnya terganggu, Anda akan kehilangan semua referensi paket Anda dan perlu menambahkan satu per satu ke setiap proyek dalam solusi Anda.
Bill Velasquez

2
@BillVelasquez hal ini hanya memakan semua referensi saya. Yah, terima kasih Tuhan untuk git, kurasa.
Gleno


13

Dalam hal ini membantu seseorang, bagi saya, tidak ada yang di atas cukup. Saya masih tidak bisa membangun, VS masih tidak dapat menemukan referensi. Kuncinya adalah hanya menutup dan membuka kembali solusi setelah mengembalikan paket.

Berikut skenarionya (menggunakan Visual Studio 2012):

Anda membuka Solusi yang memiliki paket yang hilang. Referensi menunjukkan bahwa VS tidak dapat menemukannya. Ada banyak cara untuk mengembalikan paket yang hilang, termasuk

  • membangun solusi yang diatur ke pengembalian otomatis
  • membuka Package Manager Console dan mengklik tombol "Restore" yang bagus
  • lakukan nuget restorejika Anda memiliki nuget baris perintah yang diinstal

Namun apa pun pendekatannya, referensi tersebut tetap akan ditampilkan sebagai hilang. Dan ketika Anda membangunnya akan gagal. Mendesah. Namun jika Anda menutup solusinya dan membukanya kembali, sekarang VS memeriksa lagi barang-barang bagus <HintPath>itu, menemukan bahwa paket-paket tersebut sudah kembali ke tempatnya semula, dan semuanya baik-baik saja dengan dunia.

Memperbarui

Apakah Visual Studio masih tidak melihat bahwa Anda memiliki paket? Masih menunjukkan referensi yang tidak bisa diselesaikan? Pastikan bahwa versi paket yang Anda pulihkan sama persis dengan <HintPath>di file .csproj Anda. Bahkan nomor perbaikan bug minor (mis. 1.10.1 hingga 1.10.2) akan menyebabkan referensi gagal. Anda dapat memperbaikinya dengan secara langsung mengedit csproj xml Anda, atau dengan menghapus referensi dan membuat yang baru menunjuk pada versi yang baru dipulihkan pada direktori paket.


1
Anda membuat poin yang sangat penting tentang pemulihan hanya memastikan paket berada di folder paket (yang tentu saja bisa menjadi banyak tempat). Namun penutupan dan pembukaan kembali masih tidak berfungsi untuk saya bahkan dengan versi paket yang benar, saya akhirnya harus secara manual mengubah jalur petunjuk di setiap file csproj. Saya percaya ini disebabkan oleh memindahkan folder paket relatif ke proyek.
Shaun

Mengedit .csprojfile untuk memastikan nomor versi yang cocok berfungsi untuk saya. Terima kasih!
Mateen Ulhaq

11

Sementara solusi yang disediakan oleh @jmfenoll berfungsi, ia memperbarui ke paket terbaru. Dalam kasus saya, setelah menginstal beta2 (prerelease) ia memperbarui semua libs ke RC1 (yang memiliki bug). Dengan demikian solusi di atas hanya melakukan setengah dari pekerjaan.

Jika Anda berada dalam situasi yang sama dengan saya dan Anda ingin menyinkronkan proyek Anda dengan versi persis dari paket NuGet yang Anda miliki / atau tentukan di packages.config, maka, skrip ini mungkin dapat membantu Anda. Cukup salin & tempel ke Konsol Pengelola Paket Anda

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

Dan kemudian jalankan baik dengan nama paket sepific seperti

Sync-References AutoMapper

atau untuk semua paket suka

Sync-References

Kredit pergi ke Dan Haywood dan posting blog-nya .


8

Skrip berikut dapat dijalankan di jendela Package Manger Console, dan akan menghapus semua paket dari setiap proyek dalam solusi Anda sebelum menginstalnya kembali.

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

Ini akan menjalankan skrip instalasi setiap paket lagi, yang seharusnya mengembalikan referensi perakitan yang hilang. Sayangnya, semua hal lain yang dapat dilakukan skrip instalasi - seperti membuat file dan memodifikasi konfigurasi - juga akan terjadi lagi. Anda mungkin ingin memulai dengan copy pekerjaan yang bersih, dan menggunakan alat SCM Anda untuk memilih dan memilih perubahan apa yang harus disimpan dalam proyek Anda dan yang harus diabaikan.


3

Saya menambahkan DLL secara manual. Klik kanan pada Referensi dalam proyek, pilih Tambah Referensi dan kemudian dalam dialog tekan tombol Browse. DLL NuGet di mana dalam direktori paket solusi. Untuk mendapatkan nama mereka, Anda dapat mengklik kanan pada referensi di proyek lain yang berfungsi dengan baik dan pilih properti dan lihat di path path.


Ini adalah solusi paling sederhana. Ini berfungsi untuk saya hanya dengan menelusuri folder paket.
Hao Nguyen

2

Dalam Visual Studio 2015 (Soulution berada di bawah kendali sumber, MVC-Project), csano Update-Package -Reinstall -ProjectName Your.Project.Namebekerja, tetapi itu kacau dengan beberapa kunci tulis.

Saya harus menghapus "paket" -Folder secara manual sebelumnya. (Tampaknya dikunci karena kontrol sumber).

Juga, saya harus menginstal ulang Paket MVC dari Manajer Paket NuGet.


2

Script ini akan menginstal ulang semua paket suatu proyek tanpa mengacaukan dependensi atau menginstal dependensi yang mungkin telah dihapus secara intrutlyz. (Lebih banyak untuk pengembang paket bagian mereka.)

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

1

Kalau-kalau itu membantu seseorang - Dalam skenario saya, saya memiliki beberapa perpustakaan bersama (Yang memiliki proyek / solusi TFS mereka sendiri) semua digabungkan menjadi satu solusi.

Nuget akan berhasil memulihkan proyek, tetapi DLL akan hilang.

Masalah mendasar adalah bahwa, sementara solusi Anda memiliki folder paket sendiri dan telah mengembalikannya dengan benar ke folder itu, file proyek (misalnya .csproj) merujuk pada proyek lain yang mungkin tidak memiliki paket yang diunduh. Buka file dalam editor teks untuk melihat dari mana referensi Anda berasal.

Ini dapat terjadi ketika mengelola paket pada berbagai solusi bersama yang saling terkait - karena Anda mungkin ingin memastikan semua DLL berada pada level yang sama Anda dapat mengatur ini di tingkat atas. Ini berarti bahwa kadang-kadang akan mencari solusi yang sama sekali berbeda untuk DLL direferensikan dan jadi jika Anda tidak memiliki semua proyek / solusi yang diunduh dan terbaru maka Anda mungkin mendapatkan masalah di atas.


1

Saya harus setuju dengan @Juri bahwa jawaban yang sangat populer oleh jmfenoll tidak lengkap. Dalam kasus referensi yang rusak, saya menyerahkan bahwa sebagian besar waktu Anda tidak ingin memperbarui ke paket terbaru , tetapi hanya memperbaiki referensi Anda ke versi saat ini yang kebetulan Anda gunakan. Dan Juri menyediakan fungsi praktis Sync-Referencesuntuk melakukan hal itu.

Tetapi kita bisa melangkah sedikit lebih jauh, memungkinkan fleksibilitas untuk memfilter menurut proyek dan juga paket:

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

Saya memiliki masalah yang sama dengan referensi yang hilang. Di bawah skenario saya:

  • Mesin Windows 10 segar dan VS Community 2015 diinstal
  • Baru saja memeriksa kode repositori melalui TFS
  • Satu solusi dibangun dengan baik, satu solusi memiliki satu proyek dengan referensi yang hilang (EF, System.Http, sebagai contoh), tetapi paket nuget relatif diinstal dengan benar.

Semua nomor versi dalam proyek dan paket cocok, melakukan pengembalian nuget (dengan segala cara) tidak bekerja.

Bagaimana saya memperbaikinya: cukup hapus folder paket di root solusi dan jalankan nuget restore. Pada titik ini, dll telah diunduh dengan benar dan dapat ditambahkan untuk referensi yang hilang.



0
  1. Salin file paket.config proyek dan terapkan semua versi modifikasi
  2. Hapus semua paket dan hapus depances

    $packages = Get-Package -ProjectName [nameOfProjectToRestore]
    foreach ($package in $packages) {
        uninstall-package  -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ;
    }
    
  3. Kosongkan folder paket di root proyek

  4. Salin paket.config yang dimodifikasi ke folder root situs web

  5. Jalankan kode ini untuk memulihkan proyek

    $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
    }
    
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.