Net 4.0'dan 4.5'e yeniden hedefleme çözümü - NuGet paketleri nasıl yeniden hedeflenir?


205

Şu anda VS2010 içinde .NET 4.0 VS2012 hedefleyen bir çözüm taşındı ve şimdi .Net 4.5 yeniden hedeflemek istiyorum

Emin olmadığım şey NuGet paketleri. Örneğin, VS2010'da EF4'ten güncellediğim EF5, aslında gördüğünüz gibi EF 4.4 olarak çıkıyor:

    <Reference Include="EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\packages\EntityFramework.5.0.0\lib\net40\EntityFramework.dll</HintPath>
    </Reference>

Ayrıca proje için Packages.config içinde aşağıdakileri görebilirsiniz:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="5.0.0" targetFramework="net40" />
</packages>

Benim sorum şu:

Şu anda .NET 4.0'ı .NET 4.5'i hedefleyecek şekilde ayarlanmış tüm NuGet paketlerini yeniden hedeflemek için en iyi yöntem nedir?


Yanıtlar:


266

NuGet 2.1 bunu daha basit hale getiren bir özellik sunar: update-package -reinstall -ignoreDependenciesPaket Yöneticisi Konsolu'ndan yapın.

NuGet 2.0 , uygulamalarınızı yeniden hedeflemeyi çok iyi idare etmez. Paketlerinizin hedef çerçevelerini değiştirmek için, paketleri kaldırmanız ve yeniden yüklemeniz gerekir (her birini yeniden yükleyebilmeniz için yüklediğiniz paketleri not edin).

Paketlerin kaldırılıp yeniden yüklenmesinin nedeni:

  • Bir paket kurarken, projenizin hedef çerçevesini belirleriz
  • Daha sonra uygun \ lib \ klasörünü (ve \ content \ klasörünü) bularak paket içeriğiyle eşleştiriyoruz
  • Derleme başvuruları, sağ alt klasörle birlikte paketin \ lib \ klasörüne işaret eden İpucu Yolları ile eklenir (örneğin \ lib \ net40)
  • İçerik dosyaları doğru alt klasörle birlikte paketleri \ content \ klasöründen kopyalanır (örneğin \ content \ net40)
  • Paketi package.config dosyasına yüklemek için kullanılan targetFramework dosyasını kaydediyoruz
  • Projenizin hedef çerçevesini değiştirdikten sonra, İpucu Yolları hala net40'ı gösteriyor
  • Paketleri kaldırdığınızda, projenizden kaldırılacak hedef çerçevenin kütüphanelerini / içeriğini görmek için Packages.config dosyasına kaydedilen targetFramework'u kontrol ederiz.
  • Paketi yeniden yüklediğinizde, güncellenmiş hedef çerçevenizi algılar ve doğru kütüphanelere / içeriğe başvurur / kopyalarız

VS 2012'yi ASP.NET MVC 4 projesiyle kullanarak ve .NET Framework'ü 4.0'dan 4.5'e yeniden hedefledikten sonra update-package -reinstallPaket Yöneticisi Konsolu'nda yürüttüm. Tüm paketler kaldırılmaya ve güncellenmeye başladı ve ani bir Windows 8 yeniden başlatıldı ve geri döndüğünde "Bilgisayarınız bir sorunla karşılaştı ve yeniden başlatıldı. Microsoft'a bilgi göndermek ister misiniz?" :( Korkutuyor ... Bu arada, şu anda yüklediğim NuGet sürümü: 2.2.40116.9051Burada bir sorun açtı
Leniel Maccaferri

12
-reinstall seçenekleri hiçbir zaman benim için çalışmadı. Yanlış sırayla kaldırılır ve "Y buna bağlı olduğu için X'i kaldıramıyorum" hataları bazen de paketleri okumaz. En son denediğimde, EntityFramework kaldırıldı ve daha sonra tekrar eklenmedi.
CodingWithSpike

4
update-package -reinstall benim için bir çözüm değildi. Ayrıca , kullandığımız ve test ettiğimiz sürümlere bırakmak yerine birçok paketi güncelledi . Örneğin, Ninject v3'e taşındı ve bu son derece önemli bir değişiklik.
Steve Owen

13
Güncelleme sayfasını yeniden yüklemeyi bile denemeyin. NuGet Paket yöneticisinin daha fazla ilerlemesini durdurmak zorunda kaldım, yerel makinemde koştuğunda bu şey çok karışıktı. Benim jQuery 1.10 sürümü kaldırıldı ve bir nedenle 1.4.4 ile değiştirildi. Sadece elle yapın ve kendinizi güçlükten kurtarın.
JustinMichaels

2
Dağınıklık konusunda anlaştılar ve bu yayından iki yıl sonra bile. Bazı külçelerin alt versiyonlarını buldu ve birçok referansı berbat etti. Ve bu yaklaşık iki saatlik bir güncellemeden sonraydı (2014 başından itibaren yüksek kaliteli bir iş istasyonunda). Çözümde 20 proje.
Arve Systad

42

update-package -reinstall <packagename>Komuta ile ilgili problemleri olanlar için, -ignoreDependenciesbayrağı şu şekilde çalıştırmayı düşünün :

update-package -reinstall <packagename> -ignoreDependencies

Bu bayrak, paket bağımlılıklarınızı yalnız bırakacaktır, aksi takdirde başlangıçta yeniden yüklemek istediğiniz paket hala sürümünü aynı tutsa bile güncellenebilir.

Daha fazla bilgi burada .


Teşekkürler, bu gerçekten çok fazla sorun kurtarıyor. Nuget'in 30'dan fazla projede EnterpriseLibrary'nin yaratma eğiliminde olduğu 10 kadar bağımlılığı yeniden yüklemeye çalışmasını izlemek bir gün sürecek bir işe yöneliyordu. Bu onu dakikalara indirir.
David Keaveny

Diğerlerinin de belirttiği gibi, her şeyi kırma olasılığı çok yüksektir.
Gleno

9
Paket Yöneticisi Konsolu altında çalışırken yalnızca biraz değiştirerek bunu tüm çözüm için otomatikleştirebilirsiniz:get-package | % { update-package $_.Id -reinstall -ProjectName $_.ProjectName -ignoreDependencies }
Kaleb Pederson

2
@KalebPederson Benim tecrübelerime göre komut çözüm geniş çalışır?

1
@ BjörnAliGöransson - Yeterince açık olmasaydı özür dilerim. Yanıt, çözüm boyunca tek bir paketi güncellemek için bir yol sağlar. Betiğim, çözümdeki tüm NuGet paketlerini gözden geçirecek ve çözüm boyunca yeniden hedefleyecektir. Yanıt tek bir proje için mükemmeldir, ancak yeniden hedeflenmesi gereken çok sayıda paketiniz varsa sağladığım komut dosyası daha iyi olabilir.
Kaleb Pederson

22

Kabul edilen cevabı başarısız bir şekilde denedikten sonra daha az riskli bir komut önermek istiyorum:

Update-Package <PackageName> -ProjectName <ProjectName> -Reinstall -IgnoreDependencies

Daha fazla bilgi için: http://blog.nuget.org/20121231/a-quick-tutorial-on-update-package-command.html


1
Bağlantılı belgelere göre -reinstallsadece aynı sürümü kuracak, bu yüzden kullanmak için herhangi bir fayda görmüyorum -safe. Bir şey mi kaçırıyorum?
Kaleb Pederson

4

Paketler çözümünü yeniden yüklemeye çalışırken, bir bağımlılık hatasıyla karşılaştım ( -ignoreDependenciesbayrağı kullanmasına rağmen ) ve her proje için tüm Packages.config dosyaları silinmişti. VS2013'te, paketlerin yükseltilmesi, yükseltilen tüm bağımlılıklar / referanslar yeniden projeye ekleninceye kadar diske geri döndürülmez ve yeniden eklenmez.

Benim durumumda , komut için proje -ProjectName adını ekleyerek her bir projeyi birer birer yükseltmekti update-package. Bu durumda, her proje yükseltildikçe Packages.config güncellenir.

Çok büyük çözümler için pratik olmayabilir, ancak mümkün olduğunca çok sayıda proje için otomatik yükseltme işleminden yararlanmaya ve çözümünüzdeki her pakete sahip olmadan sorunlu olanları izole etmeye makul bir uzlaşma gibi görünüyor .


3
Ben de aynı sorunla karşılaştım. UpdatePackage -Reinstallbirkaç proje için package.config ve proje referanslarını sildi (özellikle içinde sahte derlemeler oluşturulmuş olanlar). Berbat projedeki tüm değişiklikleri geri alarak ve çalışarak bu Update-Package -reinstall -ProjectName "PROJECTNAME" -IgnoreDependencies
MSC

1

Mac 2019 için Visual Studio ile Paketler klasörünü sağ tıkladığınızda menüde 'Yeniden Hedefle' seçeneği gösterilir. Bu, projede yeniden hedefleme gerektiren tüm paketler için yeniden hedefleme sorununu çözdü. Görünüşe göre Mac için Visual Studio'da (en az benimki) Araçlar menüsü altında NuGet Paket Yöneticisi yoktu, bu yüzden Paket Yöneticisi Konsolu'nu başlatamadım.

Paketler sağ tıklama menüsü altındaki Yeniden hedefle menü seçeneği

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.