NuGet'in paket.config içindeki tüm paketleri kurmasını / güncellemesini nasıl sağlayabilirim?


674

İçinde birden fazla proje bulunan bir çözümüm var. Üçüncü taraf referanslarının çoğu eksik, ancak packages.configher proje için dosya var . NuGet'in gereken tüm paketleri kurmasını / güncellemesini nasıl sağlayabilirim? Bunun her proje için komut satırı üzerinden yapılması gerekiyor mu?


10
NuGet artık Visual Studio ile çok daha entegre olduğundan ve bu sorunu çözmenin daha kolay yolları olduğundan lütfen kabul edilen yanıtı değiştirmeyi düşünün.
skolima

2
En son NuGet 2.5 sürümü ile artık paket yöneticisinde bir "Tümünü Güncelle" düğmesi var: docs.nuget.org/docs/release-notes/…
Erik Schierboom

@ErikSchierboom Teşekkürler! Bu konu şu anda mevcut olduğu için güncellenmelidir
Karl Cassar

İlgili proje: chocolatey.org
Jayan

1
Arama yapanların yararına, VS2013'te, çözümü sağ tıklayıp 'NuGet Paket Geri Yüklemeyi Etkinleştir' seçeneğini belirleyebilirsiniz. Sonra inşa edin.
HokeyJ

Yanıtlar:


870

Sen kullanabilirsiniz nuget.exe paketlerinizi geri ya da yukarıda Nuget 2.7 veya birlikte, sadece aynı zamanda eksik paketleri geri yükleyecektir olan Visual Studio içinde çözüm derlemek yüklü.

NuGet.exe için, her proje için aşağıdaki komutu çalıştırabilirsiniz.

nuget install packages.config

Veya NuGet 2.7 ile komut satırını kullanarak çözümdeki tüm paketleri geri yükleyebilirsiniz .

nuget restore YourSolution.sln

Her ikisi de paketleri aşağı çekecek. Bununla birlikte, proje dosyalarınız bu komutu çalıştırırken değiştirilmeyecektir, bu nedenle projenin zaten NuGet paketlerine başvurması gerekir. Bu durumda paketleri yüklemek için Visual Studio'yu kullanabilirsiniz.

NuGet 2.7 ve üstü ile, Visual Studio, çözümünüzü oluşturduğunuzda NuGet.exe kullanmaya gerek kalmadan eksik NuGet paketlerini otomatik olarak geri yükleyecektir.

Çözümünüzdeki tüm paketleri güncellemek için önce geri yükleyin, ardından paketleri güncellemek için NuGet.exe'yi kullanabilir veya Visual Studio'dan paketleri Paket Yöneticisi Konsolu penceresinden güncelleyebilir veya son olarak Yönet'i kullanabilirsiniz. Paketler iletişim kutusu.

Komut satırından, çözümdeki paketleri nuget.org'da bulunan en son sürüme güncelleyebilirsiniz.

nuget update YourSolution.sln

Bunun herhangi bir NuGet paketinde PowerShell betiği çalıştırmayacağını unutmayın.

Visual Studio içinden , paketleri güncelleştirmek için Paket Yöneticisi Konsolu'nu kullanabilirsiniz. Bunun, herhangi bir PowerShell betiğinin NuGet.exe'yi kullanmanın çalıştırmayacağı güncellemenin bir parçası olarak çalıştırılması avantajı vardır. Aşağıdaki komut, her projedeki tüm paketleri nuget.org'da bulunan en son sürüme güncelleyecektir.

Update-Package

Bunu bir projeyle de sınırlandırabilirsiniz.

Update-Package -Project YourProjectName

Paketleri daha önce yüklenmiş olan sürümlere yeniden yüklemek isterseniz, -reinstallargümanını Update-Packagecommand ile kullanabilirsiniz .

Update-Package -reinstall

Bunu bir projeyle de sınırlandırabilirsiniz.

Update-Package -reinstall -Project YourProjectName

-reinstallSeçenek ilk kaldırma ve daha sonra bir projeye tekrar paket kuracaktır.

Veya Manage Packagesiletişim kutusunu kullanarak paketleri güncelleyebilirsiniz .

Güncellemeler:

  • 2013/07/10 - NuGet 2.7'deki nuget geri yüklemesi hakkında bilgilerle güncellendi
  • 2014/07/06 - Visual Studio'da otomatik paket geri yükleme hakkında bilgilerle güncellendi ve NuGet'teki diğer değişikliklerle cevabı güncel hale getirdi.
  • 2014/11/21 - Hakkında bilgi ile güncellendi-reinstall

15
Visual Studio'da bunu yapmak için basit bir komut var mı? Çözüm için otomatik geri yükleme etkin ancak "Build" eksik referanslar nedeniyle hala bana çok fazla hata veriyor (paketleri Packages.config geri yüklenmedi).
Borek Bernard

1
NuGet Elektrikli El Aletleri - github.com/davidfowl/NuGetPowerTools gibi bir şey kurmadan öyle düşünmüyorum . Ancak, bu zaten sahip olduğunuz otomatik geri yükleme ile aynı şeyi yapacaktır.
Matt Ward

2
Bu aynı zamanda paketleri yalnızca "geri yüklemek" için değil, genel olarak yüklemek için de çalışır (IS yüklemeyi geri yüklerken büyük bir teknik fark yoktur; ancak çözüm paketi geri yükleme özelliğini kullanmak isteyen kişilerle sınırlı değildir). Bununla birlikte, bu amaçla EnableNuGetPackageRestore ortam değişkenini ayarlamanız gerekir. Ben "nuget install Packages.config" çağırmadan önce benim psake betiğimde şöyle ayarlayın: $ env: EnableNuGetPackageRestore = "true" Bu, makine genelindeki değişkenleri (ve muhtemelen diğer yapıları) etkilemeden PS işlemi ve ortaya çıkardığı işlemler için varyasyonu ayarlar.
Ocak'ta galaktor

Geri yükleme, yükleme ile tamamen aynı değildir. Komut satırından bir paket yüklemek projenizi değiştirmeyecek, böylece montaj referansları gibi şeyler eklenmeyecektir.
Matt Ward

3
Bir çözüm aramak için en az bir saat harcamış olmalıydım ve sonunda gerçekten de öyleUpdate-Package -reinstall -Project ProjectName
Wiz

529

Geçerli paketin TÜM PROJELERİNE tüm paketleri yeniden yükleyin:

Update-Package -Reinstall

Mevcut çözümün ÖZEL PROJESİ (tüm paketi yeniden sayesinde unarity ve ashes999 ):

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

60
Bence bu gerçekten OP istedi ve diğer tüm çözümlerden daha kolay ...
jaminto

4
ŞİMDİ RIGHT çalışmak için sadece nuke seçenek budur.
Chris

11
Bu, hedef çerçevenizi veya benzerini yeni değiştirdiyseniz de mükemmel bir seçenektir. 25 tuhaf projeyi etrafına yayılmış nuget paketleri yükleri ile güncelleme ihtimaliyle karşı karşıyaydım ve ilk komut istediğim şey için mükemmeldi. Ve aşırıya kaçma anlamında bile nükleer silah bile yok.
Chris

7
Bu sorunun cevabı bu olmalı, kabul edilen cevap işe yarıyor ama bu özellikle soruyu cevaplıyor. Tam olarak neye ihtiyaç duyulduğu için +1.
Mart'ta krystan onuruna

10
Hatta -IgnoreDependencies anahtarını eklemek isteyebilirsiniz. Ben bir Güncelleme-Paket başarısız oldu çünkü benim packages.config belirtilenden daha yeni bir sürümü var olan Kullanılan paketlerin birinin bir bağımlılık
Mathias Falkenberg

167

Visual Studio içinden bunu yapmanın başka, daha yeni ve daha hızlı bir yolu var. Check out Bu yayını David Ebbo tarafından ve belaya girerse, yorumlar bölümünü referans. Temel olarak, Paket Yöneticisi isteminde aşağıdakileri yaparsınız:

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

Daha sonra, çözümünüzü oluşturduğunuzda paketler eksikse otomatik olarak yüklenecektir.

Güncelleme:

Bu işlevsellik, Visual Studio entegrasyonu ile Nuget 1.6 içine yerleştirilmiştir , böylece NuGetPowerTools veya type komutlarını yüklemenize bile gerek yoktur. Tüm yapman gereken

Solution Explorer'da Solution düğümüne sağ tıklayın ve NuGet Paket Geri Yüklemeyi Etkinleştir'i seçin.

Daha fazla bilgi için bu makaleyi okuyun .


6
Buradaki güncel cevap, çoğu insan için nuget.exe'ye sahip olmayacak (ancak Visual Studio'ya nuget yüklü olacak) için en iyi çözüm olacaktır.
Tod Thomson

1
Ancak paket geri yükleme aslında sizin için nuget.exe dosyasını indirir
Konstantin

4
Sadece yaptım. ve hala referanslar eksik diyerek derlemede başarısız oluyor. Build, tüm paketlerin zaten kurulu olduğunu söylüyor.
Maslow

3
@Shy bu şekilde artık tüm proje dosyalarınızı değiştirmeyen bir çözüm lehine önerilmiyor.
Muffin Man

20

Web sitesi projeleri kullanıyorsanız veya NuGet Paketi geri yüklemesini etkinleştirmek istemiyorsanız başka bir çözüm.

Package.config dosyasındaki tüm paketleri numaralandırmak ve yeniden yüklemek için paket yöneticisi konsolunu kullanabilirsiniz.

# read the packages.config file into an XML object
[xml]$packages = gc packages.config

# install each package 
$packages.packages.package | % { Install-Package -id $($_.id) -Version $($_.version) }

4
Yukarıdaki cevapların her birini denedim ve çözümlerimden birinde çalışmalarını sağlayamadım. Ama bunun bir varyasyonu oldu. $packages.packages.package | % { Update-Package -reinstall -id $($_.id) }
PerryJ

1
aynı csproj üzerinde birden fazla çözüm kullanırsanız nuget paket geri yükleme bir kabus ... ben bu cevabı alkışlamak!
felickz

1
Bu benim sorunumu çözmedi ama kesinlikle beni daha iyi hissettirdi!
Şeytanın Avukatı

Bu mükemmeldir ve paketleri yeni bir projeye geçirmek için bir yol sağlar: [xml] $ Packages = gc c: \ PathToExisting \ Packages.config # # tarafından takip edilen her paketi yükleyin $ Packages.packages.package | % {Install-Package -id $ ($ _. İd) -Sürüm $ ($ _. Sürüm)}
reckface

1
@PerryJ yazmış olabilirdin Update-Package -Reinstall.
BrainSlugs83

16
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

Bu bulduğum en iyi ve en kolay örnek. Packages.config dosyasında listelenen tüm nugetleri yeniden yükler ve geçerli sürümleri korur. YourProjectNameGoesHereProje adıyla değiştirin .


Paketlerim.config, belirli sürümleri olan iki pakete referanslar içerdiğinden, bununla ilgili bazı sorunlar yaşadım, ancak bir paket belirli bir sürümü olmayan diğerine bağlıydı. Güncelleştirmeyi çalıştırdığımda, bağımlılığın daha yeni bir sürümüne 'zaten başvuruda bulunulduğu' için önce tüm paketleri kaldırdıktan sonra yeniden yükleme başarısız oldu. Kaldırma işlemi başarılı olmuştu, bu yüzden şimdi benim Packages.config boştu. Tam güncellemeyi denemeden önce Packages.config dosyasını kaynak denetiminden geri almak ve çakışan paketi güncellemek zorunda kaldım ...
Mathias FALKENBERG


7

Visual studio 2015 kullanıyorum ve yukarıda verilen çözümler benim için işe yaramadı, bu yüzden aşağıdakileri yaptım:

Çözümümden paketleri klasörünü ve ayrıca çözümdeki her projeden bin ve obj klasörlerini silin ve yeniden oluşturun.

Belki bir sonraki hataya sahip olacaksınız:

nuget.exe bulunamadı

Bunu çözmek için: NuGet.targets dosyanızdaki bu satırı değiştirin ve true olarak ayarlayın:

<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>

Referans: https://stackoverflow.com/a/30918648 ve https://stackoverflow.com/a/20502049


4

Nuget 2.8 yüklerseniz, onay kutusunu işaretleyin

Tools >> Nuget Manager >> Package Manager Settings >> Automatically check for missing packages during build

Visual Studio'da. İşaretlenirse, projeyi yeniden oluşturmak tüm referans kitaplıklarınızı geri yükleyecektir.


Visual Studio'nun kullanıcı arayüzünden en uygun seçenek. Ayrıca Allow NuGet to download missing packagesonay kutusunu da işaretlemeniz gerekir .
RBT

4

3 saat arama ve araştırmadan sonra.

Onunla sorun yaşadım çünkü takımda iki üyemiz var (GitHub kaynak kontrolünü kullanarak), uzak depoya gönderilecek paketler için dosyaları kısıtlamadığımız için, takım üyelerinden biri sunucuya paketler gönderiyordu ve bu değişiklikleri benim yerel.

Bundan sonra PO ile aynı sorunu yaşadım, ayrıca API projemi sunucuya yayınlayamadım.

At ve ben sadece kullandım

Güncelleme Paketi - Paket Yöneticisi Konsolu'nda bu komutu çalıştırın

Bu komut, çözümünüzde kullandığınız tüm paketleri yeniden yükleyecektir. (Her proje için)

Geçerli paketin TÜM PROJELERİNE tüm paketleri yeniden yükleyin:

Update-Package -ProjectName 'NameOfProject' -Reinstall - Paket Yöneticisi Konsolu'nda bu komutu çalıştırın

Bu komut, "-ProjeAdı" ndan sonra belirttiğiniz projeyle ilişkili tüm paketlerinizi yeniden yükler. Ve bunun daha iyi olduğunu düşünüyorum, çünkü tüm paketleri yeniden yüklemek için yarım saat beklemiştim.

Bunun için Rodolpho Brock'a teşekkürler .

Ayrıca, değişiklikleri uzak sunucudan aldığınızda, Visual studio tarafından görüntülenecek "Paketleri geri yükle" düğmesine basmanızı öneririm.


3

Yapmanız gereken ilk şeyin paket geri yükleme özelliğini etkinleştirmek olduğuna inanıyorum . Ayrıca buraya bakınız . Bu çözüm (proje değil) seviyesinde yapılır.

Ancak bu sizi tamamen etkilemez - Geri yükleme özelliğini etkinleştirdikten sonra benzer bir sorunla karşılaştım. (VS2013, NuGet 2.8.)

Projeyi yürüttüğümde (istemeden) paketleri kaynak kontrolüne adadım - ancak Visual Studio (ve kaynak kontrol eklentisi) check-in yaparken ikili dosyaları göz ardı etmişti.

Bir yayın dalı oluşturduğumda sorun ortaya çıktı. Dev / main / trunk şubesinin yerel kopyamda ikili dosyalar vardı, çünkü paketleri ilk yüklediğim / indirdiğim yer burası.
Ancak, yeni sürüm şubesinde,

  • paket klasör ve .nupkgdosyaların hepsi oradaydı - böylece NuGet geri yüklenecek bir şey olduğunu düşünmüyordu;
  • ama aynı zamanda, DLL'lerin hiçbiri yoktu - yani üçüncü taraf referansları eksikti - bu yüzden inşa edemedim.

Tüm paket klasörlerini sildim $(SolutionDir)/packages(serbest bırakma dalının altında) ve sonra tam bir yeniden oluşturma çalıştırdım ve bu sefer derleme başarılı oldu.
... ve sonra elbette geri döndüm ve paket klasörlerini kaynak denetiminden (bagajda ve serbest bırakma dalında) kaldırdım. Ben henüz (henüz)repositories.configDosyanın da kaldırılması .

Proje şablonları tarafından sizin için yüklenen bileşenlerin çoğu - en azından web projeleri için - NuGet paketleridir. Yani, bu sorun eklediğiniz paketlerle sınırlı değildir.
Bu nedenle, proje / çözüm oluşturulduktan hemen sonra paket geri yüklemeyi etkinleştirin ve bir ilk check-in gerçekleştirmeden önce packagesklasörü temizleyin (ve .nugetklasörü kaynak denetimine verdiğinizden emin olun ).

Yasal Uyarı: Burada SO üzerinde başka bir cevap gördüm ki bu da packages klasörü çözünürlüğün bir parçası . Bu beni doğru yola soktu, bu yüzden yazarın kredisini vermek istiyorum, ancak artık bu soruyu / cevabı bulamıyorum. Karşı karşıya gelirsem bir düzenleme yayınlayacağım.

Ayrıca ve / dosyalarını Update-Package -reinstalldeğiştireceğini de unutmayın . En azından benim durumumda böyle oldu. Hangi IMHO bu seçeneği çok daha az çekici kılıyor..sln.csproj.vbproj


Bu aynı sorunu vardı ve yapılması gereken tüm yerel paketleri silmek olduğunu söylediğimde paketleri yükseltme ve yeniden yükleme uzun zaman geçirdim.
Thomas Boby

3

Denedim Update-Package -reinstallama bir pakette başarısız oldu ve çözümümde kalan tüm proje paketlerini işlemeyi durdurdu.

Tüm package.config dosyalarını numaralandıran ve Update-Package -Reinstall -ProjectName prj -Id pkgher proje / paket için çalıştırılan betiğimle sonuçlandım .

Umarım birisi için yararlı olabilir:

$files = Get-ChildItem -Recurse -Include packages.config;

[array]$projectPackages = @();
$files | foreach { [xml]$packageFile = gc $_; $projectName = $_.Directory.Name; $packageFile.packages.package.id | foreach { $projectPackages += @( ,@( $projectName, $_ ) ) } }

$projectPackages | foreach { Update-Package -Reinstall -ProjectName $_[0] -Id $_[1] }

Düzenleme: Bu bir hatam var : Update-Package: 'EntityFramework.BulkInsert-ef6' paketi bulunamadı. Bir kurulum veya güncelleme gerçekleştirilmeden önce mevcut paketlerin geri yüklenmesi gerekir. Manuel çalışma Update-Package -Reinstall -ProjectName my_prj -Id EntityFramework.BulkInsert-ef6 çok iyi çalıştı.


2
Teşekkür ederim.
Sevinçle

Ben de sevinçle ağlıyorum! Evet!! ne zaman tasarrufu. Tıpkı Sergei'nin komut dosyasındaki son satır yerine bu satırı kullanırsanız bir FYI gibi, bağımlılıkları yüklemez. Sadece düz bir ReInstall: $ projectPackages | foreach {Update-Package -IgnoreDependencies -Reinstall -ProjectName $ _ [0] -Id $ _ [1]}
ElMatador

2

Bu duruma düşen sunucu nedeniyle buraya gelenler için, aşağıdaki gibi nuget geri yükleme komutunu çalıştırmak için exec komutunu çalıştıran bir MSBuild hedefi oluşturabilirsiniz (bu durumda nuget.exe, .nuget klasöründe değil, yolu), daha sonra çözümü oluşturmadan hemen önce TeamCity oluşturma adımında çalıştırılabilir

<Target Name="BeforeBuild">
  <Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/>
</Target>

1

şimdi Visual Studio 2012'de Nuget Package Manager Konsolu yüklü değil, orada package.config içinde herhangi bir paket bulur bulmaz otomatik olarak bir "Geri Yükle" düğmesi verir. Müthiş Özellik!


2
Bu Visual Studio 2010 için de geçerlidir
paulroho

1

VS2012 V11'de, satırın sonunda "-Reinstall" kullanırsam çalışmaz.

Bu yüzden sadece kullandım:

Update-Package -ProjectName 'NAME_OF_THE_PROJECT'

1

Bunun eski bir yazı olduğunu biliyorum, ama bunun yararlı olabileceğini düşündüm. Güncelleme işlemi sırasında (JavaScript referanslarını güncelleyen paketler gibi) belirli paketleri yok saymanız gerekiyorsa, aşağıdaki PowerShell komut dosyasını kullanın (paket kaynağınızın Package Manager Konsolu'nda "Tümü" olarak ayarlandığından emin olun):

EDIT 2014-09-25 10:55 AM EST - Koddaki bir hata düzeltildi

$packagePath = "packages.config"
$projectName = "MyProjectName"

$packagesToIgnore = @(
    "bootstrap",
    "jQuery",
    "jquery-globalize",
    "jquery.mobile",
    "jQuery.jqGrid",
    "jQuery.UI.Combined",
    "jQuery.Validation",
    "Microsoft.jQuery.Unobtrusive.Validation",
    "Modernizr",
    "Moment.js"
)

[xml]$packageFile = gc $packagePath
$packagesToProcess = $packageFile.packages.package | Where-Object {$packagesToIgnore -notcontains $_.id}

$packagesToProcess | % { Update-Package -reinstall -projectname $projectName -id $($_.id) }

1

Ne zamandan beri bilmiyorum, ama VS2019'da bunu daha kolay bir şekilde yapabilirsiniz:

  1. Solution Explorer'da sağ tıklama çözümü
  2. Nuget Paketlerini Çözüm için Yönet
  3. 4 sekme var, Göz at, Yüklendi, Güncellemeler, Birleştir
  4. Consolidate, farklı paket sürümlerini kullanan herhangi bir proje olup olmadığını gösterir (ve çoğu durumda, bu nedenle tüm paketleri güncellemek istiyoruz)
  5. Güncellemeler HERHANGİ bir projede herhangi bir güncelleme olup olmadığını gösterir. Tümünü seçin ve güncelle'yi tıklayın, iş tamamlanacaktır.

0

Visual Studio 2017'de - IDE kullanarak derlediğinizde - Tüm eksik külçe paketlerini indirecek ve "paketler" klasörüne kaydedecektir.

Ancak derleme makinesinde derleme msbuild.exe kullanılarak yapıldı. Bu durumda, nuget.exe'yi indirdim.

Her oluşturma işlemi sırasında msbuild.exe dosyasını çalıştırmadan önce. Çalıştırır -> nuget.exe geri NAME_OF_SLN_File (sadece bir .SLN dosyası varsa o parametreyi yok sayabilirsiniz).


Bunu yapmak için komut satırında SLN MSBuild -t: restore kullanabilirsiniz bulundu. MSbuild -t:restore Xxxx.sln
Mike Kelly
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.