Как мне получить NuGet для установки / обновления всех пакетов в packages.config?

674

У меня есть решение с несколькими проектами. Большинство сторонних ссылок отсутствуют, но packages.configдля каждого проекта есть файл. Как мне получить NuGet для установки / обновления всех необходимых пакетов? Нужно ли это делать через командную строку для каждого проекта?

Сэмюэль Г
источник
10
Пожалуйста, подумайте об изменении принятого ответа, поскольку NuGet теперь намного более интегрирован в Visual Studio и есть более простые способы решения этой проблемы.
Сколима
2
В последнем выпуске NuGet 2.5 теперь есть кнопка «Обновить все» в менеджере пакетов: docs.nuget.org/docs/release-notes/…
Эрик Ширбоом
@ErikSchierboom Спасибо! Эта тема должна быть обновлена, так как теперь она доступна
Карл Кассар
Связанный проект: chocolatey.org
Jayan
1
Для удобства пользователей в VS2013 вы можете щелкнуть правой кнопкой мыши решение и выбрать «Включить восстановление пакета NuGet». Тогда построй.
HockeyJ

Ответы:

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 вы можете обновить пакеты из окна консоли диспетчера пакетов, или, наконец, вы можете использовать Управление Диалог пакетов.

Из командной строки вы можете обновить пакеты в решении до последней версии, доступной на 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

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

Или вы можете обновить пакеты, используя Manage Packagesдиалоговое окно.

Обновления:

  • 2013/07/10 - Обновлено с информацией о восстановлении nuget в NuGet 2.7
  • 2014/07/06 - Обновлена ​​информация об автоматическом восстановлении пакетов в Visual Studio и обновлена ​​информация о других изменениях в NuGet.
  • 2014/11/21 - Обновлено с информацией о-reinstall
Мэтт Уорд
источник
15
Есть ли в Visual Studio какая-то простая команда для этого? У меня включено автоматическое восстановление для решения, но «Build» все равно выдает мне много ошибок из-за пропущенных ссылок (пакеты не были восстановлены из packages.config).
Борек Бернард
1
Я так не думаю, не установив что-то вроде NuGet Power Tools - github.com/davidfowl/NuGetPowerTools . Тем не менее, это сделает то же самое, что и автоматическое восстановление, которое у вас уже есть.
Мэтт Уорд
2
Это также работает для установки пакетов в целом, а не только для «восстановления» их (нет большой технической разницы, как восстановление установки IS; но оно не ограничено людьми, которые хотят использовать функцию восстановления пакета решения). Для этого вам необходимо установить переменную среды EnableNuGetPackageRestore. Я установил его в своем скрипте psake перед вызовом «nuget install packages.config» следующим образом: $ env: EnableNuGetPackageRestore = «true». Это устанавливает переменную для процесса PS и процессов, которые он порождает, не затрагивая общесистемные переменные (и, возможно, другие сборки).
Галактор
Восстановление не совсем то же самое, что установка. Установка пакета из командной строки не изменит ваш проект, поэтому такие вещи, как ссылки на сборки, не будут добавлены.
Мэтт Уорд
3
Должно быть, я потратил как минимум час на поиск решения, и, наконец, это действительно такUpdate-Package -reinstall -Project ProjectName
Wiz
529

Переустановите все пакеты во ВСЕХ ПРОЕКТАХ текущего решения:

Update-Package -Reinstall

Переустановите все пакеты в СПЕЦИАЛЬНОМ ПРОЕКТЕ текущего решения ( благодаря unarity и ashes999 ):

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
Родольфо Брок
источник
60
я думаю, что это действительно то, чего хотел ОП, и это намного проще, чем все другие решения ...
jaminto
4
Это ядерная опция, если вам нужно, чтобы она работала ПРЯМО СЕЙЧАС.
Крис
11
Это также идеальный вариант, если вы только что изменили целевую структуру или аналогичную. Я столкнулся с перспективой обновления 25 странных проектов с множеством пакетов nuget, разбитых вокруг них, и первая команда была идеальной для того, что я хотел. И даже не ядерное оружие в смысле излишеств.
Крис
7
Это должен быть ответ на этот вопрос, принятый ответ работает, но это определенно отвечает на вопрос. +1 за то, что именно то, что было нужно
Почетная честь Крыма
10
Возможно, вы даже захотите добавить параметр -IgnoreDependencies. У меня произошел сбой Update-Package, потому что зависимость одного из пакетов, которые я использовал, существовала в более новой версии, чем указано в моем package.config
Mathias Falkenberg
167

Существует другой, более новый и более быстрый способ сделать это из Visual Studio. Прочтите этот пост Дэвида Эббо и, если у вас возникнут проблемы, обратитесь к разделу комментариев. По сути, вы делаете следующее в приглашении диспетчера пакетов:

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

После этого, когда вы создаете свое решение, пакеты будут автоматически установлены, если они отсутствуют.

Обновить:

Эта функциональность встроена в Nuget 1.6 с интеграцией Visual Studio, поэтому вам даже не нужно устанавливать NuGetPowerTools или вводить команды. Все, что вам нужно сделать, это

Щелкните правой кнопкой мыши узел решения в обозревателе решений и выберите «Включить восстановление пакета NuGet».

Прочтите эту статью для более подробной информации.

Alex
источник
6
Обновленный ответ здесь будет лучшим решением для большинства людей, поскольку у них не будет nuget.exe (но в Visual Studio будет установлен nuget).
Тод Томсон
1
Но пакет восстановления на самом деле скачивает nuget.exe для вас
Константин
4
Я только что сделал это. и это все еще не в состоянии сборки, говоря, что ссылки отсутствуют. Build говорит, что все пакеты уже установлены. Я пошел в папку решения / пакетов, удалил эти пакеты, и он загрузил их и начал работать.
Маслоу
3
@Shy этот способ устарел в пользу решения, которое не изменяет все файлы вашего проекта.
Человек
20

Вот еще одно решение, если вы используете проекты веб-сайтов или не хотите включать восстановление пакета NuGet.

Вы можете использовать консоль диспетчера пакетов, чтобы перечислить все пакеты в файле 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] $ packages = gc c: \ PathToExisting \ packages.config # следует за # установкой каждого пакета $ packages.packages.package | % {Install-Package -id $ ($ _. Id) -Version $ ($ _.
Version

1
@PerryJ ты мог бы просто напечатать Update-Package -Reinstall.
BrainSlugs83

16
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

Это лучший и самый простой пример, который я нашел. Он переустановит все нюансы, перечисленные в packages.config, и сохранит текущие версии. Заменить YourProjectNameGoesHereна название проекта.


У меня были некоторые проблемы с этим, потому что мой package.config содержал ссылки на два пакета с определенными версиями, но один пакет зависел от другого без определенной версии. Когда я запустил обновление, оно сначала удалило все пакеты, а затем не удалось переустановить, потому что на более новую версию зависимости уже ссылались. Хотя удаление работало нормально, так что теперь мой файл packages.config был пуст. Я должен был вернуть package.config из системы контроля версий и обновить конфликтующий пакет, прежде чем пытаться выполнить полное обновление ...
Матиас Фалькенберг

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

Я использую Visual Studio 2015, и приведенные выше решения не помогли мне, поэтому я сделал следующее:

Удалите папку пакетов из моего решения, а также папки bin и 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), потому что мы не ограничивали файлы для пакетов для отправки в удаленный репозиторий, один из членов команды отправлял пакеты на сервер, и я получил эти изменения мой местный

После этого у меня возникла та же проблема, что и в ПО, также я не смог опубликовать свой API-проект на сервере.

На и я только что использовал

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

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

Переустановите все пакеты во ВСЕХ ПРОЕКТАХ текущего решения:

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

Эта команда переустановит все ваши пакеты, относящиеся к проекту, который вы указали после "-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

Я тоже плачу от радости! Да!! какая экономия времени Если вы будете использовать эту строку вместо последней строки в сценарии Сергея, она не установит зависимости. Просто переустановите: $ projectPackages | foreach {Update-Package -IgnoreDependencies -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>
Fetchez la vache
источник
1

теперь консоль диспетчера пакетов Nuget в Visual Studio 2012 автоматически предоставляет кнопку «Восстановить», как только она находит любой пакет, не установленный, но находящийся в файле package.config. Потрясающая особенность!

Солнечная Шарма
источник
2
Это верно и для Visual Studio 2010
paulroho
1

На VS2012 V11, если я использую «-Reinstall» в конце строки, это не работает.

Поэтому я просто использовал:

Update-Package -ProjectName 'NAME_OF_THE_PROJECT'
user3516584
источник
1

Я знаю, что это старый пост, но подумал, что это может быть полезно. Если вам необходимо игнорировать определенные пакеты во время процесса обновления (например, любые пакеты, которые обновляют ссылки JavaScript), используйте следующий сценарий PowerShell (убедитесь, что для вашего источника пакетов установлено значение «Все» в консоли диспетчера пакетов):

РЕДАКТИРОВАТЬ 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. Обновления показывают, есть ли какое-либо обновление, доступное в ЛЮБЫХ проектах. Выберите все и нажмите обновить, работа будет завершена.
Cheny
источник
0

В Visual Studio 2017 - при компиляции с использованием IDE - он загрузит все недостающие пакеты nuget и сохранит в папке «пакеты».

Но на сборочной машине компиляция выполнялась с использованием msbuild.exe. В этом случае я скачал nuget.exe.

Во время каждого процесса сборки перед выполнением msbuild.exe. Он выполнит -> nuget.exe restore NAME_OF_SLN_File (если есть только один файл .SLN, вы можете проигнорировать этот параметр).

Дэвид
источник
Я обнаружил, что вы можете использовать MSBuild -t: restore на SLN в командной строке, чтобы сделать это. MSbuild -t:restore Xxxx.sln
Майк Келли