Nuget Referanslar Geri Yüklensin mi?


182

Visual Studio 2012'de çözümüm ve projem var.

Projenin packages.configkökünde bir dosya vardır.

Bu sorunun amaçları için, bu kütüphaneleri yanlışlıkla projemin Referencesbölümünden kaldırdığımı varsayalım .

NuGet paket yöneticisine girerken, arayüz hala bu paketlerin yanında yüklü olduğunu belirten bir onay işareti bildiriyor.

Bu durumu nasıl düzeltebileceğimin tek yolu, tüm girişleri silmektir packages.config; bu, yüklenen NuGet arabiriminin sorununu düzeltir ve her birini yeniden ekler.

Daha akıllı bir yol var mı? 'Eksik paketleri geri yüklemek için etkinleştirmek nuget' etkinleştirme umuyordum, ama hiçbir şey yapmıyor gibi görünüyor.

Yanıtlar:


329

Paketleri yeniden kurmayı deneyin .

NuGet Paket Yöneticisi Konsolu'na aşağıdaki komutu girin:

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

Paketleri yeniden yüklemek ve tüm çözüm için referansları geri yüklemek istiyorsanız -ProjectNameparametreyi atlayın .


10
Bağlantının İngilizce çevirisi: translate.google.com/…
Csaba Toth

18
Not: Bu komut, başvuruları yalnızca konsolda seçilen proje yerine Visual Studio'da açık olan tüm projelere yeniden yükler.
simbolo

3
Bu komut, paketleri yalnızca seçili bir projede değil tüm çözümde yeniden kuracaktır!
Alex Sorokoletov

14
Aşırı Tehlikeli !!!! İşlem kesintiye uğrarsa, tüm paket referanslarınızı kaybedersiniz ve çözümünüzdeki her projeye birer birer eklemeniz gerekir.
Bill Velasquez

2
@ BillVelasquez bu şey tüm referanslarımı yedi. Git için tanrıya şükür, sanırım.
Gleno


13

Bunun birine yardım etmesi durumunda, benim için yukarıdakilerin hiçbiri yeterli değildi. Hala yapamadım, VS hala referansları bulamadı. Anahtar, paketleri geri yükledikten sonra çözümü kapatmak ve yeniden açmaktı .

İşte senaryo (Visual Studio 2012 kullanarak):

Eksik paketleri olan bir Çözüm açarsınız. Referanslar VS'nin onları bulamadığını gösteriyor. Eksik paketleri geri yüklemenin birçok yolu vardır;

  • otomatik geri yüklemeye ayarlanmış bir çözüm oluşturma
  • Paket Yöneticisi Konsolu'nu açma ve hoş "Geri Yükle" düğmesini tıklayın
  • yapıyor nuget restorekomut satırı Nuget yüklü olup olmadığını

Ancak yaklaşım ne olursa olsun, bu referanslar hala eksik olarak gösterilecektir. Ve inşa ettiğinizde başarısız olur. İç çekmek. Ancak, çözümü kapatıp tekrar açarsanız, VS şimdi bu güzelleri <HintPath>tekrar kontrol eder , paketlerin ait oldukları yere geri döndüğünü ve her şeyin dünya ile iyi olduğunu bulur.

Güncelleme

Visual Studio hala pakete sahip olduğunuzu görmüyor mu? Hala çözemediği bir referans gösteriyor musunuz? Geri yüklediğiniz paket sürümünün <HintPath>.csproj dosyanızdaki ile aynı olduğundan emin olun . Küçük bir hata düzeltme numarası bile (örn. 1.10.1 ila 1.10.2) başvurunun başarısız olmasına neden olur. Bunu doğrudan csproj xml'nizi düzenleyerek ya da referansı kaldırarak ve yeni bir geri yükleme paketini paketler dizinine işaret ederek düzeltebilirsiniz.


1
Geri yükleme konusunda yalnızca paketlerin paket klasöründe olduğundan emin olmanız çok önemli bir noktadır (elbette birçok yer olabilir). Ancak, doğru paket sürümlerinde bile kapatma ve yeniden açma hala benim için çalışmadı, her csproj dosyasındaki ipucu yollarını el ile değiştirmek zorunda kaldım. Bunun paket klasörünün projeye göre taşınmasından kaynaklandığına inanıyorum.
Shaun

.csprojEşleşen sürüm numaralarının benim için çalıştığından emin olmak için dosyayı düzenlemek . Teşekkürler!
Mateen Ulhaq

11

@Jmfenoll tarafından sağlanan çözüm çalışırken, en son paketlere güncellenir. Benim durumumda, beta2 (yayın öncesi) yükledikten sonra tüm libs RC1 (bir hata vardı) güncellendi. Böylece yukarıdaki çözüm işin sadece yarısını yapar.

Benimle aynı durumdaysanız ve projenizi, içinde bulunduğunuz / veya belirttiğiniz NuGet paketlerinin tam sürümüyle senkronize etmek istiyorsanız packages.config, o zaman bu komut dosyası size yardımcı olabilir. Basitçe kopyalayıp Paket Yöneticisi Konsolunuza yapıştırın

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

Ve sonra ya

Sync-References AutoMapper

veya tüm paketler için

Sync-References

Krediler Dan Haywood ve blog gönderisine gidiyor .


8

Aşağıdaki komut dosyası Paket Yöneticisi Konsolu penceresinde çalıştırılabilir ve yeniden yüklemeden önce çözümünüzdeki her projedeki tüm paketleri kaldırır.

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

Bu, eksik montaj referanslarını geri yüklemesi gereken her paketin kurulum komut dosyasını tekrar çalıştıracaktır. Ne yazık ki, komut dosyaları yükleyen diğer tüm şeyler - dosya oluşturmak ve yapılandırmaları değiştirmek gibi - yine gerçekleşecektir. Muhtemelen temiz çalışan bir kopyayla başlamak isteyeceksiniz ve projenizde hangi değişikliklerin saklanacağını ve hangilerinin göz ardı edileceğini seçmek için SCM aracınızı kullanabilirsiniz.


3

DLL'leri el ile ekledim. Projede Referanslar'a sağ tıklayın, Referans Ekle'yi seçin ve iletişim kutusunda Gözat düğmesine basın. NuGet DLL'leri çözümün paketleri dizininde. Bunların adlarını almak için düzgün çalışan başka bir projedeki referanslara sağ tıklayıp özellikleri seçebilir ve path özelliğine bakabilirsiniz.


Bu en basit çözüm. Sadece paketleri klasörüne göz atarak benim için çalışıyor.
Hao Nguyen

2

Visual Studio 2015'te (Soulution kaynak kontrolü altında, MVC-Project), csano Update-Package -Reinstall -ProjectName Your.Project.Nameçalıştı, ancak bazı yazma kilitleriyle uğraştı .

Daha önce manuel olarak "paketleri" -Klasörü silmek zorunda kaldı. (Kaynak kontrolü nedeniyle kilitli görünüyordu).

Ayrıca, MVC Paketini NuGet Paket Yöneticisi'nden yeniden kurmak zorunda kaldım.


2

Bu komut dosyası, bir projenin tüm paketlerini bağımlılıkları ya da kasıtlı olarak kaldırılmış olabilecek bağımlılıkları yüklemeden yeniden yükler. (Parça paketi geliştiricileri için daha fazlası.)

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

1

Birine yardım etmesi durumunda - Senaryomda, hepsi tek bir çözümde birleştirilen bazı paylaşılan kütüphanelerim var (ki kendi TFS projeleri / çözümleri var).

Nuget projeleri başarılı bir şekilde geri yükler, ancak DLL eksik olur.

Temel sorun, çözümünüzün kendi paketleri klasörü olmasına ve bunları bu klasöre doğru bir şekilde geri yüklerken, proje dosyasının (örneğin .csproj), paketi indirilmemiş olabilecek farklı bir projeye başvurmasıydı. Referanslarınızın nereden geldiğini görmek için dosyayı bir metin düzenleyicide açın.

Bu, farklı bağlantılı paylaşılan çözümlerde paketleri yönetirken ortaya çıkabilir - muhtemelen tüm DLL'lerin aynı düzeyde olduğundan emin olmak istediğinizden, bunu en üst düzeyde ayarlayabilirsiniz. Bu, bazen referans alınan bir DLL için tamamen farklı bir çözüm arıyor olacağı anlamına gelir ve bu yüzden tüm projelerin / çözümlerin indirilmediği ve güncel olmadığı takdirde yukarıdaki sorunu alabilirsiniz.


1

@Juri ile anlaşıyorum, jmfenoll'un son derece popüler cevabı tam değil. Kırık referansların durumda, yapmanız çoğu zaman o teslim değil Güncellemenin istediğiniz son paketin, ancak yalnızca için başvuruları düzeltmek geçerli kullandığınız olmak gerçekleştiğini sürümleri. Ve Juri Sync-Referencesbunu yapmak için kullanışlı bir işlev sağladı.

Ancak, biraz daha ileri giderek, projeye ve pakete göre filtreleme esnekliğine izin verebiliriz:

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

Eksik referanslarla aynı sorunu yaşadım. Senaryomun altında:

  • Yeni Windows 10 makinesi ve VS Community 2015 kurulumu
  • TFS üzerinden depo kodunu yeni kontrol ettim
  • Bir çözüm gayet iyi inşa edildi, bir çözümün eksik referansları olan bir projesi vardı (EF, System.Http, örnek olarak), ancak göreli nuget paketleri düzgün bir şekilde kuruldu.

Proje ve paketlerdeki tüm sürüm numaraları eşleşir, nuget geri yüklemesi (tüm yollarla) çalışmadı.

Nasıl düzelttim: çözüm kökündeki paket klasörlerini silin ve nuget geri yüklemesini yürütün. Bu noktada dll doğru şekilde indirilir ve eksik referanslar için eklenebilir.



0
  1. Projects.config dosyasını kopyalayın ve tüm sürüm değişikliklerini uygular
  2. Tüm paketlerin bağlantısını kaldırın ve bağımlılıkları kaldırın

    $packages = Get-Package -ProjectName [nameOfProjectToRestore]
    foreach ($package in $packages) {
        uninstall-package  -projectname [nameOfProjectToRestore] -id $package.Id -version $package.version -RemoveDependencies -force ;
    }
    
  3. Projenin kök dizinindeki Packages klasörünü temizleme

  4. Modifiye package.config dosyasını web sitesinin kök klasörüne kopyalayın

  5. Projeyi geri yüklemek için bu kodu çalıştırın

    $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
    }
    
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.