Paket NuGet Kembalikan Tidak Bekerja

165

Saya memeriksa sebuah proyek di satu komputer, memeriksa yang lain, dan menemukan bahwa binari yang diinstal oleh NuGet hilang. Saya bisa memeriksanya di kontrol sumber juga, tetapi sepertinya ada solusi yang lebih baik:

http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages

Saya mengikuti instruksi itu, sekarang memiliki .nugetfolder di mana orang seharusnya, memiliki entri berikut di file .csproj saya:

<RestorePackages>true</RestorePackages>
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />

namun ketika saya membangun kembali solusi saya, paket yang hilang tidak dikembalikan.

Apa yang saya lewatkan? Bagaimana saya bisa mendiagnosis masalah ini?

Eric J.
sumber
Apakah Anda melihat nuget.exe dipicu di log Output?
Pranav
Dan yang penting: apakah Anda melihat kesalahan dalam log Output?
maartenba

Jawaban:

272

Catatan Anda dapat memaksa pemulihan paket untuk dijalankan dengan menjalankan perintah berikut di konsol manajer paket nuget

Perbarui-Paket-Instal ulang

Memaksa instalasi ulang semua yang ada dalam solusi.


Update-Package -Reinstall -ProjectName myProj

Pasukan instalasi ulang semua dalam proyek myProj.

Catatan : Ini adalah opsi nuklir. Saat menggunakan perintah ini, Anda mungkin tidak mendapatkan versi yang sama dari paket yang telah Anda instal dan itu dapat menyebabkan masalah. Ini lebih kecil kemungkinannya terjadi pada tingkat proyek dibandingkan dengan tingkat solusi.

Anda dapat menggunakan -safeopsi parameter commandline untuk membatasi upgrade ke versi yang lebih baru dengan komponen versi Major dan Minor yang sama. Opsi ini ditambahkan kemudian dan menyelesaikan beberapa masalah yang disebutkan dalam komentar.

Perbarui-Paket-Instal ulang -Safe

Chris Marisic
sumber
7
@ NightOwl888 yang kedengarannya seperti sesuatu yang perlu dilaporkan ke nuget karena seharusnya tidak ada cara untuk melakukan itu, kecuali mungkin Anda benar-benar selalu memiliki masalah mengikat DLL neraka dan jika beruntung itu berfungsi, tetapi menginstal ulang itu mengakhiri keberuntungan Anda untuk bekerja.
Chris Marisic
4
@nightowl jika Anda menggunakan kontrol sumber, seharusnya tidak sulit untuk mendukung perubahan.
ErikE
4
Penarikan utama di sini adalah bahwa versi paket tidak dipertahankan, sehingga versi paket terbaru akan diinstal. Ini bisa menjadi masalah jika proyek Anda tidak kompatibel dengan versi baru ..
JDandChips
4
Ya, Paket-Pembaruan-Instal bekerja untuk saya. Saya tidak tahu mengapa IDE tidak melakukannya. Semuanya diatur dengan benar. Ugghh, aku bersumpah, NuGet baik dan menyebalkan.
Jeremy Ray Brown
2
baik Anda menambahkan "penting! ini bisa menghancurkan proyek Anda" di BOTTOM jawaban Anda!
devman
25

Untuk orang lain yang menemukan posting ini, baca ini.

NuGet 2.7+ memperkenalkan kami ke Pemulihan Paket Otomatis . Ini dianggap sebagai pendekatan yang jauh lebih baik untuk sebagian besar aplikasi karena tidak merusak proses MSBuild. Kurang sakit kepala.

Beberapa tautan untuk Anda mulai:

Dave New
sumber
2
Terima kasih atas jawaban yang sesuai dengan versi NuGet saat ini.
Eric J.
20

Anda harus memilih salah satu cara berikut ini:

Menginstal ulang paket dengan namanya di semua proyek solusi:

Update-Package –reinstall <packageName>

Menginstal ulang paket dengan namanya dan mengabaikan dependensinya dalam semua proyek solusi:

Update-Package –reinstall <packageName> -ignoreDependencies

Menginstal ulang paket dengan namanya di proyek:

Update-Package –reinstall <packageName> <projectName>

Instal ulang semua paket dalam proyek tertentu:

Update-Package -reinstall -ProjectName <projectName>

Menginstal ulang semua paket dalam solusi:

Update-Package -reinstall 
Mohammad Dayyan
sumber
Memecahkan masalah saya dengan gaya cepat dan kotor.
blackorchid
20

Apakah Anda mengaktifkan mode pemulihan paket di proyek yang memiliki paket / binari yang hilang? Ada masalah yang diketahui yang mengharuskan paket diinstal dengan benar saat mengaktifkan mode pengembalian:

http://nuget.codeplex.com/workitem/1879


Tautan asli sudah mati; ini mungkin pengganti: https://github.com/NuGet/Home/issues/1968

Alexandre Dion
sumber
3
Terima kasih untuk tautannya. Mengaktifkan mode pemulihan paket dalam proyek yang memiliki paket / binari yang hilang akan menjadi kasus umum. Jika Anda tidak memiliki paket, saat itulah Anda ingin mendapatkannya. Kasus penggunaan gagal.
Anthony
2
Ketika Anda berkata, "aktifkan mode pemulihan paket di proyek yang memiliki paket yang hilang", apa maksud Anda? Apakah ada perintah konsol yang harus saya jalankan untuk melakukan itu?
CodeWarrior
90
NuGet mengecewakan saya setiap hari, saya sangat membencinya.
Jammer
14

VS 2017

Alat> Manajer Paket NuGet> Pengaturan Manajer Paket> Umum Klik pada "Kosongkan Semua Cache NuGet"

Niaz Morshed
sumber
Ketika memeriksa solusi di luar kendali sumber (dikelola menggunakan Visual Studio Team Explorer dengan DevOps / Git) build tidak dimungkinkan karena referensi yang hilang dan paket pemulihan tidak melakukan apa-apa. Solusi ini adalah yang benar untuk keadaan ini.
PJRobot
12

Saya telah mengalami masalah ini dalam dua skenario.

Pertama, ketika saya mencoba membangun solusi dari baris perintah menggunakan msbuild.exe. Kedua, ketika saya mencoba untuk membangun SLN dan proyek-proyek yang mengandung pada server build saya menggunakan TFS dan CI.

Saya mendapatkan kesalahan dengan mengklaim bahwa referensi tidak ada. Ketika memeriksa direktori build lokal saya dan server TFS, saya melihat bahwa folder / paket tidak dibuat, dan paket nuget tidak disalin. Mengikuti instruksi yang tercantum dalam jawaban Alexandre http://nuget.codeplex.com/workitem/1879 juga tidak bekerja untuk saya.

Saya telah mengaktifkan Paket Pemulihan melalui VS2010 dan saya telah melihat build hanya bekerja dari dalam VS2010. Sekali lagi, menggunakan msbuild gagal. Solusi saya mungkin benar-benar tidak valid, tetapi untuk lingkungan saya ini semua bekerja dari membangun baris perintah secara lokal, serta dari CI membangun di TFS.

Saya masuk ke. \ Nuget dan mengubah baris ini di file .nuget \ NuGet.targets:

dari:

<RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" -o "$(PackagesDir)"</RestoreCommand>

ke: (perhatikan, tanpa tanda kutip di sekitar variabel)

<RestoreCommand>$(NuGetCommand) install $(PackagesConfig) -source $(PackageSources) -o $(PackagesDir)</RestoreCommand>

Saya mengerti bahwa jika direktori saya memiliki ruang di dalamnya, ini akan gagal, tetapi saya tidak memiliki ruang di direktori saya dan jadi solusi ini membuat bangunan saya berhasil diselesaikan ... untuk saat ini.

Saya akan mengatakan bahwa menyalakan log level diagnostik dalam build Anda akan membantu menunjukkan perintah apa yang sedang dijalankan oleh msbuild. Inilah yang membuat saya meretas file target sementara.

Perry
sumber
Saya memiliki masalah dengan tanda kutip ganda dan harus mengedit yang sama dengan yang Anda lakukan. Sangat membuat frustrasi!
Greg
5

Jika hal lain tidak berhasil, coba:

  1. Tutup Proyek.
  2. Hapus folder paket di folder solusi Anda.
  3. Buka Project lagi dan kembalikan Paket Nugget lagi.

Bekerja untuk saya dan mudah untuk dicoba.

Loaderon
sumber
2
Ini berhasil untuk saya. Pada langkah 3, saya tidak perlu mengembalikan paket secara manual - mereka dipulihkan secara otomatis ketika saya membuka proyek.
Tawab Wakil
5

Jika tidak ada jawaban lain yang cocok untuk Anda, cobalah yang berikut ini yang merupakan satu-satunya hal yang berhasil bagi saya:

Temukan .csprojfile Anda dan edit dalam editor teks.

Temukan <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">tag di .csprojfile Anda dan hapus seluruh blok.

Instal ulang semua paket dalam solusi:

Update-Package -reinstall

Setelah ini paket nuget Anda harus dikembalikan, saya pikir ini mungkin kasus pinggiran yang hanya terjadi ketika Anda memindahkan proyek Anda ke lokasi yang berbeda.

Jako Basson
sumber
Ini menyelamatkan saya dari menjadi benar-benar gila. Terima kasih!
Jeff Hay
4

Hanya untuk orang lain yang mungkin mengalami masalah ini, saya dapat menyelesaikan masalah dengan menutup Visual Studio dan membuka kembali proyek. Ketika proyek dimuat, paket dipulihkan selama fase inisialisasi.

Mike Perrenoud
sumber
4

Bagi saya, saya punya tag kosong NuGetPackageImportStamp di .csproj

<NuGetPackageImportStamp>
    </NuGetPackageImportStamp>

Idealnya harus berisi beberapa GUID yang valid.

Menghapus tag di atas dan kemudian "Restore Nugets" bekerja untuk saya.

anu
sumber
1

Terkadang sesuatu yang aneh terjadi dan menggunakan Visual Studio untuk secara otomatis mengembalikan tidak berfungsi. Jika demikian, Anda dapat menggunakan Konsol Manajer Paket NuGet. Itu dibuka di dalam Visual Studio dari Alat -> NuGet Package Manager -> Package Manager Console . Perintah di dalam konsol itu sederhana. Dan untuk mendapatkan bantuan konteks saat mengetik perintah cukup tekan tombol dan itu akan memberi Anda semua opsi yang dimulai dengan huruf yang Anda ketikkan. Jadi jika paket tidak diinstal, misalnya log4net, ketikkan perintah berikut:

Instal-Paket log4net

Anda dapat melakukan lebih banyak lagi, seperti menentukan versi untuk menginstal, memperbarui paket, menghapus paket, dll.

Saya harus menggunakan konsol untuk membantu saya ketika Visual Studio bertindak seperti orang aneh.

Jeremy Ray Brown
sumber
1

Pemulihan Paket Otomatis akan gagal karena salah satu dari alasan berikut:

  1. Anda tidak menghapus file NuGet.exe dan NuGet.targets dari folder .nuget solusi (yang dapat ditemukan di folder root solusi Anda)
  2. Anda tidak mengaktifkan pengembalian paket otomatis dari Tools >> Opsi >> Nuget Package Manager >> Pengaturan umum.
  3. Anda lupa menghapus referensi di semua proyek Anda secara manual ke file Nuget.targets
  4. Anda perlu me-restart Visual Studio (pastikan prosesnya mati dari task manager Anda sebelum memulai lagi).

Artikel berikut menguraikan secara lebih rinci bagaimana caranya tentang poin 1-3: https://docs.nuget.org/consume/package-restore/migrating-to-automatic-package-restore

CShark
sumber
1
Mengenai poin # 1 Anda, tautan yang Anda berikan bertentangan dengan saran Anda: "Jika Anda menggunakan TFS 1. Hapus file NuGet.exe dan NuGet.targets dari folder .nuget solusi 2. Simpan file NuGet.Config untuk terus memintas menambahkan paket ke kontrol sumber. "
Andrew Dennison
1

Saya memiliki paket NuGet yang rusak setelah saya melakukan Pemulihan Sistem pada sistem saya, mencadangkannya sekitar dua hari. (Paket NuGet telah diinstal untuk sementara waktu.) Untuk memperbaikinya, saya harus pergi ke folder .nuget \ paket di profil pengguna saya, temukan paket-paket itu, dan hapus. Hanya kemudian Visual Studio akan menarik paket ke bawah dan menambahkannya dengan benar sebagai referensi.

Harun
sumber
1

Solusi terbaik yang saya temukan membuat Proyek baru dari awal, lalu mengimpor semua file sumber dengan kode. Proyek saya tidak begitu rumit sehingga saya tidak punya masalah dari sana.

Martin Deivid
sumber
1

Tidak ada solusi lain yang berfungsi dalam situasi saya:

Ketergantungan AspNetCore telah diinstal / dihapus dan sedang di-cache. 'AspNetCore.All' akan menolak untuk memperbarui / menginstal ulang / menghapus dengan benar. Dan terlepas dari apa yang saya lakukan, itu akan menggunakan dependensi cache (bahwa itu tidak kompatibel dengan), karena mereka adalah versi yang lebih tinggi.

  1. Cadangkan Semuanya. Perhatikan daftar Ketergantungan yang harus Anda instal ulang, Keluar dari VisualStudio
  2. Buka semua file .proj dalam editor teks dan hapus semua PackageReference
  3. Di setiap proyek, hapus bin,obj folder
  4. Hapus folder "paket" yang Anda temukan dalam solusi.
  5. Buka solusi, masuk ke Tools > Nuget Package Manager > Package Manager SettingsdanClear all Nuget caches . Periksa konsol karena mungkin gagal menghapus beberapa item - salin jalur folder dan keluar dari studio visual.
  6. Hapus apa saja dari folder itu Buka kembali solusi dan mulai menginstal paket nuget lagi dari awal.

Jika itu masih tidak berhasil, ulangi tetapi juga cari drive Anda di windows explorer untuk nugetdan menghapus apa pun yang tampak cachey.

jv_
sumber
0

vs2015 tidak mengaktifkan masalah nuget restore. Solusi saya:

  1. tambahkan folder .nuget, tambahkan file NuGet.Config dan NuGet.targets di Direktori .nuget

  2. setiap file proyek tambahkan: build

  <RestorePackages>true</RestorePackages>

  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
  </Target>
方 权 军
sumber
Ini adalah cara lama untuk melakukannya. Lihat jawaban @davenewza, dan tautannya ke blog.davidebbo.com/2014/01/...
timB33
0

Jika kesalahan yang Anda hadapi adalah "tidak dapat terhubung ke server jauh" seperti milik saya, maka akan bermanfaat bagi Anda untuk memiliki cek ini di samping cek yang diberikan dalam komentar di atas.

Saya melihat bahwa ada 2 Sumber Paket NUGET dari mana paket-paket itu dapat diunduh (dalam Tools-> Nuget Package Manager-> Pengaturan Packager Manager). Salah satu Sumber Paket tidak berfungsi dan Nuget mencoba mengunduh dari sumber itu saja.

Banyak hal yang terjadi setelah saya mengubah sumber paket untuk diunduh dari: https://www.nuget.org/api/v2/ EXPLICTLY dalam pengaturan

vamsee
sumber
0

Dalam kasus saya, upaya pemulihan Nuget yang dibatalkan telah merusak salah satu packages.configfile dalam solusi. Saya tidak menemukan ini sebelum memeriksa pohon kerja git saya. Setelah mengembalikan perubahan dalam file, pemulihan Nuget kembali berfungsi.

Frederik Struck-Schøning
sumber
0

Ada jalan pintas untuk membuat Nuget restore berfungsi, 1. Pastikan koneksi internet atau url Nuget tepat di menu opsi VS Tools 2. Lihat .nuget atau folder nuget dalam solusinya, selain itu - salin dari sembarang untuk mendapatkan nuget.exe

  1. HAPUS paket folder, jika ada

  2. Buka konsol Package manager, jalankan perintah ini

    • tempel path lengkap nuget.exe KEMBALIKAN path lengkap file .sln!
  3. gunakan perintah Install-pacakge, jika build tidak mendapatkan referensi yang hilang. Hope It Helps (HIH)
HydTechie
sumber
0

Di VS2017, klik kanan pada solusi => Buka CommandLine => Baris Perintah Pengembang.

Setelah terbuka, ketikkan (dan tekan enter setelah)

dotnet restore

Itu akan mengembalikan semua paket, dan Anda mendapatkan output konsol yang bagus dari apa yang telah dilakukan ...

James Joyce
sumber