У меня есть решение с несколькими проектами. Большинство сторонних ссылок отсутствует, но для каждого проекта есть packages.config файл. Как заставить NuGet установить / обновить все необходимые пакеты? Нужно ли это делать с помощью командной строки для каждого проекта?
Как заставить NuGet установить / обновить все пакеты в файле packages.config?
Ответы (17)
Вы можете использовать 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
Update-Package -Project YourProjectName не будет использовать версии из packages.config, вместо этого будет использоваться последняя версия, что не всегда хорошо.
- person Ben Wilde; 21.11.2014
Update-Package -Project YourProjectName -Reinstall
- person Matt Ward; 21.11.2014
Update-Package -reinstall -Project ProjectName
- person Wiz; 07.01.2016
nuget update YourSolution.sln … не будет запускать сценарии PowerShell ни в каких пакетах NuGet…. Верно ли это утверждение для NuGet.exe 4.7 и выше?
- person Uwe Keim; 28.09.2018
Открыть консоль диспетчера пакетов
- Просмотр - ›Другие Windows -› Консоль диспетчера пакетов
Переустановите все пакеты во ВСЕХ ПРОЕКТАХ текущего решения:
Update-Package -Reinstall
Переустановите все пакеты в КОНКРЕТНОМ ПРОЕКТЕ текущего решения (Благодаря unarity и ashes999):
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
Update-Package : Already referencing a newer version of 'Newtonsoft.Json'. Я решил восстановить свои файлы packages.config и попробовать переустановить при сборке
- person Rob Von Nesselrode; 27.07.2014
Есть еще один, более новый и быстрый способ сделать это из Visual Studio. Ознакомьтесь с этим сообщением Дэвида Эббо, и обратитесь к разделу комментариев, если у вас возникнут проблемы. Обычно в приглашении диспетчера пакетов вы делаете следующее:
PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore
Впоследствии, когда вы создадите свое решение, пакеты будут автоматически установлены, если они отсутствуют.
Обновление:
Эта функция встроена в Nuget 1.6 с интеграцией Visual Studio, поэтому вам даже не нужно устанавливать NuGetPowerTools или вводить команды. Все, что тебе нужно сделать, это
Щелкните правой кнопкой мыши узел «Решение» в обозревателе решений и выберите «Включить восстановление пакета NuGet».
Дополнительные сведения см. В этой статье.
Вот еще одно решение, если вы используете проекты веб-сайтов или не хотите включать восстановление пакета 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) }
$packages.packages.package | % { Update-Package -reinstall -id $($_.id) }
- person PerryJ; 01.02.2013
Update-Package -Reinstall.
- person BrainSlugs83; 21.06.2017
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
Это лучший и самый простой пример, который я нашел. Он переустановит все nugets, перечисленные в packages.config, и сохранит текущие версии. Замените YourProjectNameGoesHere именем проекта.
В последней версии NuGet 2.5 в диспетчере пакетов теперь есть кнопка «Обновить все»: http://docs.nuget.org/docs/release-notes/nuget-2.5#Update_All_button_to_allow_updating_all_packages_at_once
Я использую 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
Если вы устанавливаете Nuget 2.8, установите флажок
Tools >> Nuget Manager >> Package Manager Settings >> Automatically check for missing packages during build
в Visual Studio. Если он отмечен, то просто перестройте проект, чтобы восстановить все ваши справочные библиотеки.
Allow NuGet to download missing packages.
- person RBT; 07.07.2017
После 3 часов поиска и расследования.
У меня были проблемы с этим, потому что у нас есть два члена в команде (с использованием системы управления версиями GitHub), потому что мы не ограничивали файлы для пакетов для отправки в удаленный репозиторий, один из членов команды отправлял пакеты на сервер, и я получил эти изменения в мой местный.
После этого у меня возникла та же проблема, что и у PO, также я не смог опубликовать свой проект API на сервере.
В и я только что использовал
Update-Package -Reinstall - запустите эту команду в консоли диспетчера пакетов.
Эта команда переустановит все ваши пакеты, которые вы использовали в своем решении. (Для каждого проекта)
Переустановите все пакеты во ВСЕХ ПРОЕКТАХ текущего решения:
Update-Package -ProjectName 'NameOfProject' -Reinstall - запустите эту команду в консоли диспетчера пакетов.
Эта команда переустановит все ваши пакеты, связанные с проектом, который вы указали после «-ProjectName». И я думаю, что это лучше, потому что мне пришлось ждать полчаса, чтобы переустановить все пакеты в решении.
За это большое спасибо Родольфо Броку.
Кроме того, я бы порекомендовал вам, когда вы получаете изменения с удаленного сервера, нажимать кнопку «Восстановить пакеты», которая будет отображаться Visual Studio.
Я считаю, что первое, что вам нужно сделать, это включить функцию восстановления пакета. См. Также здесь. Это делается на уровне решения (а не проекта).
Но это не поможет вам полностью - я столкнулся с аналогичной проблемой после включения функции восстановления. (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 и _9 _ / _ 10_. По крайней мере, так было в моем случае. Что ИМХО делает этот вариант менее привлекательным.
Для тех, кто прибыл сюда из-за того, что сервер сборки не справился с этим, вы можете создать цель MSBuild, запустив команду exec для запуска команды nuget restore, как показано ниже (в этом случае nuget.exe находится в .nuget, а не по пути), который затем можно запустить на этапе сборки TeamCity непосредственно перед сборкой решения.
<Target Name="BeforeBuild">
<Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/>
</Target>
Я попробовал 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 работал очень хорошо.
теперь консоль диспетчера пакетов Nuget в Visual Studio 2012 автоматически дает вам кнопку «Восстановить», как только обнаруживает, что какой-либо пакет не установлен, но находится в package.config. Отличная особенность!
В VS2012 V11, если я использую «-Reinstall» в конце строки, это не сработает.
Поэтому я просто использовал:
Update-Package -ProjectName 'NAME_OF_THE_PROJECT'
Я знаю, что это старый пост, но подумал, что это может быть полезно. Если вам необходимо игнорировать определенные пакеты во время процесса обновления (например, любые пакеты, которые обновляют ссылки JavaScript), используйте следующий сценарий PowerShell (убедитесь, что для источника вашего пакета установлено значение «Все» в консоли диспетчера пакетов):
РЕДАКТИРОВАТЬ 2014-09-25 10:55 AM 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) }
Не знаю, с каких пор, но в VS2019 это можно сделать проще:
- решение, щелкнув правой кнопкой мыши в обозревателе решений
- выберите Управление пакетами Nuget для решения
- есть 4 вкладки: Обзор, Установлено, Обновления, Объединить.
- Consolidate показывает, есть ли какие-либо проекты, использующие разные версии пакетов (и в большинстве случаев именно поэтому мы хотим обновить все пакеты)
- Обновления показывают, есть ли какие-либо обновления в ЛЮБЫХ проектах. Выберите все и нажмите «Обновить», работа будет выполнена.
В Visual Studio 2017 - при компиляции с использованием IDE - все недостающие пакеты nuget будут загружены и сохранены в папке «пакеты».
Но на сборочной машине компиляция производилась с помощью msbuild.exe. В этом случае я скачал nuget.exe.
Во время каждого процесса сборки перед запуском msbuild.exe. Он выполнит -> nuget.exe восстановит NAME_OF_SLN_File (если есть только один файл .SLN, вы можете игнорировать этот параметр).
MSbuild -t:restore Xxxx.sln
- person Mike Kelly; 16.01.2019
Update-Package -Reinstall. - person BrainSlugs83   schedule 20.06.2017