Як мені змусити NuGet встановити / оновити всі пакунки пакунків.config?


674

У мене є рішення з кількома проектами в ньому. Більшість посилань сторонніх організацій відсутні, але packages.configдля кожного проекту є файл. Як мені змусити NuGet встановити / оновити всі необхідні пакети? Чи потрібно це робити за допомогою командного рядка для кожного проекту?


10
Будь ласка, подумайте про зміну прийнятої відповіді, оскільки NuGet тепер значно інтегрований у Visual Studio і є більш прості способи вирішити цю проблему.
Сколіма

2
З останньою версією NuGet 2.5 тепер у "Менеджері пакунків" з'явилася
Ерік Щербоом

@ErikSchierboom Дякую! Цю нитку слід оновити, оскільки вона тепер доступна
Карл Кассар

Суміжний проект: chocolatey.org
Jayan

1
Для користі пошукових запитів у VS2013 ви можете клацнути правою кнопкою миші рішення та вибрати "Увімкнути відновлення пакету NuGet". Потім будуйте.
ХокейJ

Відповіді:


870

Ви можете використовувати nuget.exe для відновлення ваших пакетів або з встановленим NuGet 2.7 або вище, ви можете просто скласти своє рішення в Visual Studio, який також відновить відсутні пакети.

Для NuGet.exe можна виконати наступну команду для кожного проекту.

nuget install packages.config

Або за допомогою NuGet 2.7 ви можете відновити всі пакети в розчині за допомогою командного рядка.

nuget restore YourSolution.sln

Обидва вони знімуть пакунки. Однак ваші файли проекту не будуть змінені під час виконання цієї команди, тому проект вже повинен мати посилання на пакети NuGet. Якщо це не так, ви можете використовувати Visual Studio для встановлення пакетів.

З NuGet 2.7 і вище, Visual Studio автоматично відновить відсутні пакети NuGet під час створення вашого рішення, тому немає необхідності використовувати NuGet.exe.

Щоб оновити всі пакунки у вашому рішенні, спочатку відновіть їх, а потім ви можете використовувати NuGet.exe для оновлення пакетів або з Visual Studio, ви можете оновити пакунки у вікні консолі менеджера пакунків або, нарешті, ви можете скористатися Manage. Діалогове вікно пакетів.

З командного рядка ви можете оновити пакети в рішенні до останньої версії, доступної на nuget.org.

nuget update YourSolution.sln

Зауважте, що це не буде запускати будь-які сценарії PowerShell в будь-яких пакунках NuGet.

Зсередини Visual Studio ви можете використовувати консоль диспетчера пакетів для оновлення пакетів. Це має перевагу, що будь-які сценарії PowerShell запускатимуться як частина оновлення, оскільки, використовуючи NuGet.exe, їх не буде запускатись. Наступна команда оновить усі пакети кожного проекту до останньої версії, доступної на nuget.org.

Update-Package

Ви також можете обмежити це лише одним проектом.

Update-Package -Project YourProjectName

Якщо ви хочете перевстановити пакети до тих же версій, що і раніше встановлені, ви можете використовувати -reinstallаргумент з Update-Packageкомандою.

Update-Package -reinstall

Ви також можете обмежити це лише одним проектом.

Update-Package -reinstall -Project YourProjectName

The -reinstallВаріант буде першим видалити , а потім встановити пакет назад в проект.

Або ви можете оновити пакети за допомогою Manage Packagesдіалогового вікна.

Оновлення:

  • 2013/07/10 - Оновлено інформацією про відновлення Nuget у NuGet 2.7
  • 2014/07/06 - Оновлено інформацією про автоматичне відновлення пакунків у Visual Studio і привело відповідь у відповідність до інших змін у NuGet.
  • 21.11.2014 - оновлено інформацією про-reinstall

15
Чи є якась проста команда в Visual Studio, щоб це зробити? У мене ввімкнено автоматичне відновлення для рішення, але "Build" все ще дає мені багато помилок через відсутні посилання (пакунки не були відновлені з пакети.config).
Борек Бернард

1
Я не думаю, що не встановлюючи щось на зразок NuGet Power Tools - github.com/davidfowl/NuGetPowerTools . Однак це зробить по суті те саме, що і автоматичне відновлення, яке ви вже маєте.
Метт Уорд

2
Це також працює для встановлення пакетів взагалі, а не просто для їх "відновлення" (немає великої технічної різниці, як відновлення встановлення IS; але це не обмежено для людей, які хочуть використовувати функцію відновлення пакета рішень). Однак вам потрібно встановити змінну середовища EnableNuGetPackageRestore для цієї мети. Я встановлюю його у своєму сценарії psake перед тим, як викликати "nuget install пакети.config", наприклад: $ env: EnableNuGetPackageRestore = "true". Це встановлює var для процесу PS та процесів, які він породжує, не впливаючи на загальноміські змінні (та, можливо, інші збірки).
галактор

Відновлення не зовсім те саме, що встановлення. Встановлення пакету з командного рядка не змінить ваш проект, тому такі речі, як посилання на збірку, не будуть додані.
Метт Уорд

3
Я, мабуть, витратив принаймні годину на пошуки рішення, і, нарешті, це було дійсноUpdate-Package -reinstall -Project ProjectName
Wiz

529

Перевстановіть усі пакети у ВСІ ПРОЕКТИ поточного рішення:

Update-Package -Reinstall

Перевстановіть усі пакети в СПЕЦИФІЧНИЙ ПРОЕКТ поточного рішення ( завдяки непристойності та попелу999 ):

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

60
Я думаю, що це дійсно те, чого хотіла ОП, і простіше, ніж усі інші рішення ...
jaminto

4
Це нульовий варіант, якщо він просто потрібен, щоб він працював ПРАВО ЗАРАЗ.
Кріс

11
Це також ідеальний варіант, якщо ви щойно змінили цільову структуру чи подібне. Я стояв перед можливістю оновити 25 непарних проектів з безліччю наборів пакетів, рознесених навколо них, і перша команда була ідеальною для того, що я хотів. І навіть не нуклеозний у сенсі перенасичення.
Кріс

7
Це має бути відповіддю на це питання, прийнята відповідь справді працює, але це конкретно відповідає на питання. +1 за те, що саме те, що було потрібно.
krystan honor

10
Ви навіть можете додати перемикач -IgnoreDependitions. У мене не вдалося оновити пакет, оскільки залежність одного з пакунків, які я використовував, існувала в більш новій версії, ніж зазначено в моїх пакетах
.config

167

Існує ще один, новіший і швидший спосіб зробити це з Visual Studio. Ознайомтеся з цим дописом Девідом Еббо та зверніться до розділу коментарів, якщо у вас виникли проблеми. В основному, ви робите наступне в підказці менеджера пакунків:

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

Згодом, коли ви будуєте рішення, пакети будуть автоматично встановлені, якщо вони відсутні.

Оновлення:

Ця функціональність вбудована в Nuget 1.6 з візуальною інтеграцією студії, тому вам навіть не потрібно встановлювати NuGetPowerTools або вводити команди. Все, що вам потрібно зробити - це

Клацніть правою кнопкою миші на вузлі рішення в Провіднику рішень і виберіть Увімкнути відновлення пакета NuGet.

Прочитайте цю статтю для більш детальної інформації.


6
Оновлена ​​відповідь тут стане найкращим рішенням для більшості людей, оскільки вони не матимуть nuget.exe (але він буде встановлений у Visual Studio).
Тод Томсон

1
Але відновлення пакета фактично завантажує для вас nuget.exe
Костянтин

4
Я щойно це зробив. і це все ще не дає змоги сказати, що посилання відсутні. Збірка говорить, що всі пакунки вже встановлені. Я перейшов до папки рішення / пакунків, видалив обговорюваний пакет (и), і завантажив їх, і почав працювати.
Маслоу

3
@Ши цей спосіб тепер застарілий на користь рішення, яке не змінює всі ваші файли проекту.
The Muffin Man

20

Ось ще одне рішення, якщо ви використовуєте проекти веб-сайтів або не хочете ввімкнути відновлення NuGet Package.

Ви можете використовувати консоль менеджера пакунків, щоб перерахувати всі пакунки у файлі package.config та повторно встановити їх.

# 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
Я спробував кожну з вищезазначених відповідей і не зміг змусити їх працювати над одним із моїх рішень. Але варіант цього був. $packages.packages.package | % { Update-Package -reinstall -id $($_.id) }
PerryJ

1
відновлення пакунків nuget - це кошмар, якщо ви використовуєте кілька рішень на одному csproj ... я аплодую цю відповідь!
felickz

1
Це не вирішило моєї проблеми, але це впевнено змусило мене почувати себе краще!
Адвокат диявола

Це чудово, і це дає змогу перенести пакунки до нового проекту: [xml] $ пакети = gc c: \ PathToExisting \ пакети.config # слідує # встановити кожен пакет $ пакети.packages.package | % {Install-Package -id $ ($ _. Id) -Version $ ($ _. Версія)}
reckface

1
@PerryJ, ти могла щойно набрати Update-Package -Reinstall.
BrainSlugs83

16
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

Це найкращий і найпростіший приклад, який я знайшов. Він перевстановить усі нути, які перелічені в пакетах.config, і збереже поточні версії. Замініть YourProjectNameGoesHereназвою проекту.


У мене були деякі проблеми з цим, тому що мій пакунок.config містив посилання на два пакети з конкретними версіями, але один пакет залежав від іншого без конкретної версії. Коли я запустив оновлення, він спочатку видалив усі пакунки, а потім не вдався до перевстановлення, оскільки на нову версію залежності вже було "посилання". Видалення працювало нормально, тому тепер мій пакунок.config був порожнім. Мені довелося повернути пакети.config з контролю джерела та оновити конфліктний пакет, перш ніж спробувати повне оновлення ...
Mathias Falkenberg

11

З останньою версією NuGet 2.5 тепер у "Менеджері пакунків" є кнопка "Оновити все": http://docs.nuget.org/docs/release-notes/nuget-2.5#Update_All_button_to_allow_updating_all_packages_at_once


2
Також з консолі диспетчера пакунків ви можете запустити "Update-Package", щоб виконати всі пакунки у вашому проекті: nuget.codeplex.com/wikipage?title=Updating%20All%20Packages
kmp

7

Я використовую візуальну студію 2015, і рішення, наведені вище, не працювали для мене, тому я зробив наступне:

Видаліть папку пакунків із мого рішення, а також папки бін та obj з кожного проекту в рішенні та перетворіть її на повторну перебудову.

Можливо, у вас буде наступна помилка:

не вдається знайти nuget.exe

Щоб вирішити це, змініть цей рядок у файлі NuGet.targets та встановіть його на true:

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

Довідка: https://stackoverflow.com/a/30918648 та https://stackoverflow.com/a/20502049


4

Якщо ви встановлюєте Nuget 2.8, поставте прапорець

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

у Visual Studio. Якщо це встановлено, просто відновити проект відновить усі ваші довідкові бібліотеки.


Найзручніший варіант від інтерфейсу Visual Studio. Ви також повинні встановити Allow NuGet to download missing packagesпрапорець.
RBT

4

Після 3 годин пошуку та розслідування.

У мене були проблеми з цим, оскільки у нас є два члени команди (використовуючи керування джерелом GitHub), оскільки ми не обмежували файли для пакетів для відправки у віддалене сховище, один із членів команди надсилав пакунки на сервер, і я перетягнув ці зміни на мій місцевий.

Після цього у мене була така ж проблема, як і PO, і я не зміг опублікувати свій проект API на сервері.

У та я щойно використовував

Update-Package -Reinstall - запустіть цю команду на консолі диспетчера пакунків

Ця команда перевстановить усі ваші пакети, які ви використовували у своєму рішенні. (Для кожного проекту)

Перевстановіть усі пакети у ВСІ ПРОЕКТИ поточного рішення:

Update-Package -ProjectName 'NameOfProject' -Встановити - запустіть цю команду на консолі диспетчера пакунків

Ця команда переустановить усі ваші пакети, які відносяться до проекту, який ви вказали після "-ProjectName". І я думаю, що це краще, тому що мені довелося почекати півгодини, щоб перевстановити всі пакети в рішення.

За це велике спасибі Родольфо Броку .

Також я рекомендую вам, коли ви перетягуєте зміни з віддаленого сервера, натискати кнопку "Відновити пакети", яка буде показана Visual studio.


3

Я вважаю, що перше, що вам потрібно зробити, це включити функцію відновлення пакета . Дивіться також тут . Це робиться на рівні рішення (не проекту).

Але це не спричинить вас до кінця - я зіткнувся з подібною проблемою після того, як увімкнув функцію відновлення. (VS2013, NuGet 2.8.)

Виявилося, я ненавмисно зобов’язав пакунки контролювати джерело, коли я здійснив проект - але Visual Studio (і плагін управління джерелом) корисно ігнорував двійкові файли під час реєстрації.

Проблема виникла, коли я створив гілку випуску. Моя локальна копія відділення dev / main / trunk мала бінарні файли, тому що саме там я спочатку встановив / завантажив пакунки.
Однак у новій галузі випуску

  • папки та .nupkgфайли пакетів були там - так що NuGet не думав, що відновити є щось;
  • але в той же час жодна з DLL не була присутня - тобто відсутні сторонні посилання - тому я не міг будувати.

Я видалив усі папки пакунків у $(SolutionDir)/packages(під відділенням випуску), а потім запустив повне відновлення, і цього разу збірка вдалася.
... і тоді, звичайно, я повернувся назад і вилучив папки пакетів з керування джерелом (у гілці ствола та звільнення). Мені не зрозуміло (поки)repositories.config слід також видалити файл.

Багато компонентів, встановлених для вас шаблонами проектів - принаймні для веб-проектів, - це пакети NuGet. Тобто ця проблема не обмежується доданими вами пакетами.
Тож увімкніть відновлення пакету відразу після створення проекту / рішення, і перед тим, як здійснити початкову реєстрацію, очистіть packagesпапку (і переконайтеся, що ви зобов’язали .nugetпапку керувати джерелом).

Відмова: Я побачив тут ще одну відповідь на SO, яка вказувала, що очищення packagesпапки було частиною резолюції. Це поставило мене на правильний шлях, тому я хотів би дати автору кредит, але я більше не можу знайти це питання / відповідь. Я опублікую редакцію, якщо я наткнуся на неї.

Я також зазначу, що Update-Package -reinstallзмінить файли .slnта .csproj/ .vbproj. Принаймні, це і було в моєму випадку. Який ІМХО робить цей варіант набагато менш привабливим.


У мене виникла така сама проблема, і я довго витрачався на оновлення та перевстановлення пакунків, коли, як ви кажете, все, що потрібно було зробити, - це видалити локальні пакунки.
Томас Бобі

3

Я спробував, Update-Package -reinstallале не вдалося отримати пакет і перестав обробляти всі інші пакети проектів у своєму рішенні.

Я закінчив свій скрипт, який перераховує всі файли package.config і запускається Update-Package -Reinstall -ProjectName prj -Id pkgдля кожного проекту / пакета.

Сподіваюся, це може бути корисним для когось:

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

Редагувати: Це помилка, яку я мав: Update-Package: Не вдається знайти пакет 'EntityFramework.BulkInsert-ef6'. Перед встановленням або оновленням слід відновити існуючі пакети. Ручний пробіг Update-Package -Reinstall -ProjectName my_prj -Id EntityFramework.BulkInsert-ef6 спрацював дуже добре.


2
Дякую. Я плачу від радості
cleftheris

Я теж плачу від радості! Так!! що заощаджує час. Як FYI, якщо ви використовуєте цей рядок замість останнього рядка в сценарії Сергія, він не встановить залежності. Просто прямий ReInstall: $ projectPackages | foreach {Update-Package -IgnoreDependitions -Reinstall -ProjectName $ _ [0] -Id $ _ [1]}
ElMatador

2

Для тих, хто приїжджає сюди через помилку цього сервера збірки, ви можете створити ціль MSBuild, що виконує команду exec, щоб виконати команду відновлення nuget , як нижче (у цьому випадку nuget.exe знаходиться в папці .nuget, а не в шлях), який потім можна виконати на етапі збирання TeamCity безпосередньо перед побудовою рішення

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

1

тепер консоль диспетчера пакунків Nuget у Visual Studio 2012 дає автоматично кнопку "Відновити", як тільки він знайде будь-який пакет, не встановлений, а там у package.config. Дивовижна особливість!


2
Це справедливо і для Visual Studio 2010
paulroho

1

У VS2012 V11, якщо я використовую "-встановити" в кінці рядка, він не працює.

Тому я просто використав:

Update-Package -ProjectName 'NAME_OF_THE_PROJECT'

1

Я знаю, що це старий пост, але думав, що це може бути корисним. Якщо під час процесу оновлення вам потрібно ігнорувати конкретні пакети (як і будь-які пакети, що оновлюють посилання на JavaScript), використовуйте такий скрипт PowerShell (переконайтеся, що для консолі менеджера пакунків встановлено значення "Усі"):

EDIT 25.09.2014 10:55 EST - Виправлена ​​помилка в сценарії

$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

Не знаєте, коли, але у VS2019 ви можете зробити це простіше:

  1. клацніть правою кнопкою миші рішення в Провіднику рішень
  2. виберіть Управління Nuget пакети для рішення
  3. є 4 вкладки, Огляд, Встановлення, Оновлення, Консолідація
  4. Консолідація показує, чи є проекти, що використовують різні версії пакетів (і в більшості випадків, тому ми хочемо оновити всі пакети)
  5. оновлення показує, чи є якесь оновлення доступне в будь-яких проектах. Виберіть усе та натисніть оновлення, робота буде виконана.

0

У Visual Studio 2017 - Коли ви компілюєте за допомогою IDE - він завантажить усі відсутні пакети нута та збереже у папці "пакети".

Але на складанні машини компіляція виконувалася за допомогою msbuild.exe. У цьому випадку я завантажив nuget.exe.

Під час кожного процесу збирання перед виконанням msbuild.exe. Він виконає -> nuget.exe відновлення NAME_OF_SLN_File (якщо є лише один .SLN-файл, ви можете проігнорувати цей параметр).


Я виявив, що ви можете використовувати MSBuild -t: Resto в SLN в командному рядку, щоб зробити це. MSbuild -t:restore Xxxx.sln
Майк Келлі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.