Как мне получить NuGet для установки / обновления всех пакетов в packages.config?
У меня есть решение с несколькими проектами. Большинство сторонних ссылок отсутствуют, но есть packages.config
файл для каждого проекта. Как мне получить NuGet для установки / обновления всех необходимых пакетов? Это нужно сделать через командную строку для каждого проекта?
16 ответов
Вы можете использовать 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.
To update all the packages in your solution, first restore them, and then you can either use NuGet.exe to update the packages or from within Visual Studio you can update the packages from the Package Manager Console window, or finally you can use the Manage Packages dialog.
From the command line you can update packages in the solution to the latest version available from nuget.org.
nuget update YourSolution.sln
Note that this will not run any PowerShell scripts in any NuGet packages.
From within Visual Studio you can use the Package Manager Console to also update the packages. This has the benefit that any PowerShell scripts will be run as part of the update where as using NuGet.exe will not run them. The following command will update all packages in every project to the latest version available from nuget.org.
Update-Package
You can also restrict this down to one project.
Update-Package -Project YourProjectName
If you want to reinstall the packages to the same versions as were previously installed then you can use the -reinstall
спорить с Update-Package
команда.
Update-Package -reinstall
You can also restrict this down to one project.
Update-Package -reinstall -Project YourProjectName
-reinstall
option will first uninstall and then install the package back again into a project.
Or, you can update the packages using the Manage Packages
Диалог.
Обновления:
- 2013/07/10 - Updated with information about nuget restore in NuGet 2.7
- 2014/07/06 - Updated with information about automatic package restore in Visual Studio and brought the answer up to date with other changes to NuGet.
- 2014/11/21 - Updated with information about
-reinstall
Существует другой, более новый и более быстрый способ сделать это из Visual Studio. Прочтите этот пост Дэвида Эббо и, если у вас возникнут проблемы, обратитесь к разделу комментариев. По сути, вы делаете следующее в приглашении диспетчера пакетов:
PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore
После этого при создании решения пакеты будут автоматически установлены, если они отсутствуют.
Обновить:
Эта функциональность встроена в Nuget 1.6 с визуальной студийной интеграцией, поэтому вам даже не нужно устанавливать 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) }
Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall
Это лучший и самый простой пример, который я нашел. Он переустановит все нюансы, перечисленные в 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>
Ссылка: /questions/20445744/kak-vklyuchit-vosstanovlenie-paketa-nugets-v-visual-studio-2015/20445750#20445750 и /questions/26086045/nevozmozhno-najti-nugetexe-pri-sozdanii-veb-servisa-na-appharbor/26086050#26086050
После 3 часов поиска и расследования.
У меня были проблемы с этим, потому что у нас есть два члена в команде (используя контроль исходного кода GitHub), потому что мы не ограничивали файлы для пакетов для отправки в удаленный репозиторий, один из членов команды отправлял пакеты на сервер, и я получил эти изменения мой местный
После этого у меня возникла та же проблема, что и в ПО, также я не смог опубликовать свой API-проект на сервере.
На и я только что использовал
Update-Package -Reinstall - запустить эту команду в консоли диспетчера пакетов
Эта команда переустановит все ваши пакеты, которые вы использовали в своем решении. (Для каждого проекта)
Переустановите все пакеты во ВСЕХ ПРОЕКТАХ текущего решения:
Update-Package -ProjectName 'NameOfProject' -Reinstall - запустить эту команду в консоли диспетчера пакетов
Эта команда переустановит все ваши пакеты, относящиеся к проекту, который вы указали после "-ProjectName". И я думаю, что это лучше, потому что мне пришлось ждать полчаса, чтобы переустановить все пакеты в решении.
За это большое спасибо Rodolpho Brock.
Также я бы порекомендовал вам при извлечении изменений с удаленного сервера нажать кнопку "Восстановить пакеты", которая будет отображаться в Visual Studio.
Если вы устанавливаете Nuget 2.8, установите флажок
Tools >> Nuget Manager >> Package Manager Settings >> Automatically check for missing packages during build
в Visual Studio. Если этот флажок установлен, то просто перестройте проект, чтобы восстановить все ваши справочные библиотеки.
Для тех, кто прибывает сюда из-за нарушения правил сервера сборки, вы можете создать цель MSBuild, запустив команду exec для запуска команды восстановления nuget, как показано ниже (в этом случае nuget.exe находится в папке.nuget, а не в путь), который затем можно запустить на этапе сборки TeamCity непосредственно перед созданием решения.
<Target Name="BeforeBuild">
<Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/>
</Target>
Я считаю, что первое, что вам нужно сделать, это включить функцию восстановления пакетов. Смотрите также здесь. Это делается на уровне решения (не проекта).
Но это не поможет вам полностью - я столкнулся с подобной проблемой после включения функции восстановления. (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
файлы. По крайней мере, так оно и было в моем случае. Что ИМХО делает этот вариант гораздо менее привлекательным.
Я старался 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
работал очень хорошо.
На VS2012 V11, если я использую "-Reinstall" в конце строки, это не работает.
Поэтому я просто использовал:
Update-Package -ProjectName 'NAME_OF_THE_PROJECT'
Теперь консоль диспетчера пакетов Nuget в Visual Studio 2012 автоматически предоставляет кнопку "Восстановить", как только она находит любой пакет, не установленный, но находящийся в файле package.config. Потрясающая особенность!
Я знаю, что это старый пост, но подумал, что это может быть полезно. Если вам необходимо игнорировать определенные пакеты во время процесса обновления (например, любые пакеты, которые обновляют ссылки 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) }
Не знаю, с каких пор, но в VS2019 это можно сделать проще:
- щелкните решение правой кнопкой мыши в обозревателе решений
- выберите Управление пакетами Nuget для решения
- есть 4 вкладки: Обзор, Установлено, Обновления, Объединить
- Consolidate показывает, есть ли какие-либо проекты, использующие разные версии пакетов (и в большинстве случаев именно поэтому мы хотим обновить все пакеты)
- Обновления показывают, доступны ли какие-либо обновления в ЛЮБЫХ проектах. Выберите все и нажмите "Обновить", работа будет выполнена.
В Visual Studio 2017 - при компиляции с использованием IDE - он загрузит все недостающие пакеты nuget и сохранит в папке "пакеты".
Но на сборочной машине компиляция выполнялась с использованием msbuild.exe. В этом случае я скачал nuget.exe.
Во время каждого процесса сборки перед выполнением msbuild.exe. Он выполнит -> nuget.exe restore NAME_OF_SLN_File (если есть только один файл.SLN, вы можете игнорировать этот параметр).