Как заставить NuGet устанавливать/обновлять все пакеты в файле packages.config?

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

Ответ 1

Вы можете использовать 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

Ответ 2

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

Update-Package -Reinstall

Переустановите все пакеты в SPECIFIC PROJECT текущего решения (спасибо unarity и ashes999):

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

Ответ 3

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

PM> Install-Package NuGetPowerTools
PM> Enable-PackageRestore

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

Update:

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

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

Подробнее читайте эту статью.

Ответ 4

Здесь другое решение, если вы используете проекты веб-сайта, или не хотите включать восстановление пакета 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) }

Ответ 5

Update-Package -ProjectName 'YourProjectNameGoesHere' -Reinstall

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

Ответ 7

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

Удалите папку пакетов из моего решения, а также папки bin и obj из каждого проекта в решении и дайте ему перестроить.

Возможно, у вас будет следующая ошибка:

невозможно найти nuget.exe

Чтобы решить эту проблему: измените эту строку в файле NuGet.targets и установите для нее значение true:

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

Ссылка: fooobar.com/questions/14702/... и fooobar.com/questions/14703/...

Ответ 8

После 3 часов поиска и расследования.

У меня были проблемы с этим, потому что у нас есть два члена в команде (с использованием управления исходными текстами GitHub), потому что мы не ограничивали файлы для пакетов для отправки в удаленный репозиторий, один из членов команды отправлял пакеты на сервер, и я тянул который изменяется на мой локальный.

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

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

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

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

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

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

Эта команда переустановит все ваши пакеты, относящиеся к проекту, указанному после "-ProjectName". И я думаю, что это лучше, потому что я подождал полчаса, чтобы переустановить все пакеты в решении.

За это огромное спасибо Родольфо Брок.

Кроме того, я бы порекомендовал вам, что, когда вы извлекаете изменения с удаленного сервера, нажмите кнопку "Восстановить пакеты", которая будет показана в Visual Studio.

Ответ 9

Я считаю, что первое, что вам нужно сделать, это включить функцию восстановления пакета. См. Также здесь. Это делается на уровне решения (не проекта).

Но это не поможет вам полностью - я столкнулся с подобной проблемой после включения функции восстановления. (VS2013, NuGet 2.8.)

Оказалось, что я (непреднамеренно) передал пакеты в исходный элемент управления, когда я совершил проект, но Visual Studio (и плагин для управления версиями) с осторожностью игнорировали двоичные файлы при выполнении регистрации.

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

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

Я удалил все папки пакетов в $(SolutionDir)/packages (под ветвью выпуска), а затем выполнил полную перестройку, и на этот раз сборка завершилась успешно.
... и, конечно же, я вернулся и удалил папки с исходным кодом (в ствол и релиз). Пока неясно, следует ли удалить файл repositories.config.

Многие компоненты, установленные для вас по шаблонам проекта - по крайней мере, для веб-проектов - это пакеты NuGet. То есть, эта проблема не ограничивается пакетами, которые вы добавили.
Поэтому включите восстановление пакета сразу после создания проекта/решения, и перед выполнением начальной регистрации очистите папку packages (и убедитесь, что вы скопировали папку .nuget в исходное управление).

Отказ от ответственности: я увидел еще один ответ здесь, где указано, что очистка папки packages была частью разрешения. Это поставило меня на правильный путь, поэтому я хотел бы дать автору кредит, но я больше не могу найти этот вопрос/ответ. Я отправлю редактирование, если я наткнулся на него.

Я также хотел бы отметить, что Update-Package -reinstall будет изменять файлы .sln и .csproj/.vbproj. По крайней мере, то, что он сделал в моем случае. Какой ИМХО делает этот вариант гораздо менее привлекательным.

Ответ 10

Если вы установите Nuget 2.8, установите флажок

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

в Visual Studio. Если он установлен, то просто перестроить проект восстановит все ваши справочные библиотеки.

Ответ 11

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

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

Ответ 12

Я попробовал 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 работал очень хорошо.

Ответ 13

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

Ответ 14

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

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

Update-Package -ProjectName 'NAME_OF_THE_PROJECT'

Ответ 15

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

EDIT 2014-09-25 10:55 AM EST - Исправлена ​​ошибка в script

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

Ответ 16

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

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

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

Ответ 17

Мой первый опыт использования пакетов NuGet был с Visual Studio 2005, я полагаю, или, может быть, с 2010 года. В любом случае, в то время пакет сборки автоматически восстанавливал все, когда вы создавали проект. Мне кажется, что это больше не так. Я что-то пропустил?