Восстановление пакета NuGet не работает

165

Я зарегистрировался в проекте на одном компьютере, проверил на другом и обнаружил, что двоичные файлы, установленные NuGet, отсутствуют. Я мог бы также проверить их в системе контроля версий, но, похоже, есть лучшее решение:

http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages

Я следовал этим инструкциям, теперь у меня есть .nugetпапка, в которой нужно находиться, и в моем файле .csproj есть следующие записи:

<RestorePackages>true</RestorePackages>
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />

и все же, когда я перестраиваю свое решение, отсутствующие пакеты не восстанавливаются.

Чего мне не хватает? Как я могу диагностировать эту проблему?

Эрик Дж.
источник
Вы видите, что nuget.exe запускается в журнале вывода?
Пранав
И главное: вы видите какие-либо ошибки в журнале вывода?
Мартенба

Ответы:

272

Обратите внимание, что вы можете принудительно выполнить восстановление пакета, выполнив следующие команды в консоли диспетчера пакетов nuget

Обновление-Пакет-Переустановка

Принудительно переустанавливает все в решении.


Пакет обновлений -Переустановите -ProjectName myProj

Принудительно переустанавливает все в проекте myProj.

Примечание : это ядерный вариант. При использовании этой команды вы можете не получить те же версии установленных пакетов, что может привести к проблемам. Это реже происходит на уровне проекта, чем на уровне решения.

Вы можете использовать -safeпараметр параметра командной строки, чтобы ограничить обновления до более новых версий с одним и тем же компонентом Major и Minor версии. Эта опция была добавлена ​​позже и решает некоторые проблемы, упомянутые в комментариях.

Пакет обновлений -Переустановить -Safe

Крис Марисик
источник
7
@ NightOwl888, что звучит как что-то, о чем нужно сообщать в nuget, потому что не должно быть никакого способа, которым он мог бы это сделать, если, возможно, у вас не было проблем с связыванием ада DLL, и, к счастью, это работало, но переустановка его положила конец вашей удаче.
Крис Марисик
4
@nightowl, если вы используете систему контроля версий, не так уж сложно отреагировать на изменения.
ErikE
4
Основным недостатком здесь является то, что версии пакетов не поддерживаются, поэтому будет установлена ​​последняя версия пакета. Это может быть проблемой, если ваш проект не совместим с новой версией ..
JDandChips
4
Да, пакет обновлений -Переустановка работает для меня. Я понятия не имею, почему IDE просто не делает этого. Все настроено правильно. Тьфу, клянусь, NuGet и хорош, и раздражает.
Джереми Рэй Браун
2
мило с вашей стороны добавить "важно! это может разрушить ваш проект" в нижней части вашего ответа!
devman
25

Для тех, кто наткнулся на этот пост, прочитайте это.

NuGet 2.7+ познакомил нас с автоматическим восстановлением пакетов . Это считается гораздо лучшим подходом для большинства приложений, поскольку он не вмешивается в процесс MSBuild. Меньше головных болей.

Некоторые ссылки для начала:

Дэйв Нью
источник
2
Спасибо за ответ, соответствующий текущей версии NuGet.
Эрик Дж
20

Вы должны выбрать один из следующих способов:

Переустановка пакета по его имени во всех проектах решения:

Update-Package –reinstall <packageName>

Переустановка пакета по имени и игнорирование его зависимостей во всех проектах решения:

Update-Package –reinstall <packageName> -ignoreDependencies

Переустановка пакета по его имени в проекте:

Update-Package –reinstall <packageName> <projectName>

Переустановка всех пакетов в конкретном проекте:

Update-Package -reinstall -ProjectName <projectName>

Переустановка всех пакетов в решении:

Update-Package -reinstall 
Мохаммад Даян
источник
Решил мою проблему быстро и грязно.
blackorchid
20

Вы включили режим восстановления пакетов в проекте, в котором отсутствуют недостающие пакеты / двоичные файлы? Существует известная проблема, которая требует правильной установки пакетов при включении режима восстановления:

http://nuget.codeplex.com/workitem/1879


Исходная ссылка не работает; это может быть заменой: https://github.com/NuGet/Home/issues/1968

Александр дион
источник
3
Спасибо за ссылку. Включение режима восстановления пакетов в проекте, в котором отсутствуют недостающие пакеты / двоичные файлы, будет обычным делом. Если у вас нет пакетов, тогда вы захотите их получить. Сбой в случае использования.
Энтони
2
Когда вы говорите «включить режим восстановления пакетов в проекте, в котором отсутствуют пакеты», что вы имеете в виду? Есть ли консольная команда, которую мне нужно выполнить, чтобы сделать это?
CodeWarrior
90
NuGet подводит меня каждый день, я его полностью презираю.
Jammer
14

VS 2017

Инструменты> Диспетчер пакетов NuGet> Настройки диспетчера пакетов> Общие Нажмите «Очистить все кэш-память NuGet»

Ниаз Моршед
источник
При выводе решения из-под контроля исходного кода (управляемого с помощью Visual Studio Team Explorer с DevOps / Git) сборки были невозможны из-за отсутствия ссылок, а пакеты восстановления ничего не делали. Это решение было правильным для этого обстоятельства.
PJRobot
12

Я столкнулся с этой проблемой в двух сценариях.

Во-первых, когда я пытаюсь построить свое решение из командной строки, используя msbuild.exe. Во-вторых, когда я пытаюсь собрать sln и содержащие проекты на моем сервере сборки, используя TFS и CI.

Я получаю ошибки, утверждая, что ссылки отсутствуют. При проверке моего локального каталога сборки и сервера TFS я вижу, что папка / packages не создается, а пакеты nuget не копируются. Следование инструкциям, приведенным в ответе Александра, http://nuget.codeplex.com/workitem/1879 также не сработало для меня.

Я включил восстановление пакетов через VS2010, и я видел, что сборки работают только из VS2010. Опять же, использование msbuild fails. Мой обходной путь, вероятно, совершенно недопустим, но для моей среды это все работает как из локальной командной строки, так и из сборки CI в TFS.

Я вошел в. \ Nuget и изменил эту строку в файле .nuget \ NuGet.targets:

из:

<RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)" -o "$(PackagesDir)"</RestoreCommand>

to: (обратите внимание, без кавычек вокруг переменных)

<RestoreCommand>$(NuGetCommand) install $(PackagesConfig) -source $(PackageSources) -o $(PackagesDir)</RestoreCommand>

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

Я скажу, что включение регистрации уровня диагностики в вашей сборке поможет показать, какие команды выполняет msbuild. Это то, что заставило меня временно взломать файл целей.

PerryM
источник
У меня была проблема с двойными кавычками, и мне пришлось сделать то же редактирование, что и вы. Очень расстраивает!
Грег
5

Если что-то еще не работает, попробуйте:

  1. Закрыть проект.
  2. Удалите папку пакетов в папке вашего решения.
  3. Снова откройте Project и снова восстановите Nugget Packages.

Работал на меня, и это легко попробовать.

Loaderon
источник
2
Это сработало для меня. На шаге 3 мне не нужно было вручную восстанавливать пакеты - они восстанавливались автоматически при открытии проекта.
Таваб Вакиль
5

Если ни один из других ответов не работает для вас, попробуйте следующее, которое было единственным, что сработало для меня:

Найдите свой .csprojфайл и отредактируйте его в текстовом редакторе.

Найдите <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">тег в вашем .csprojфайле и удалите весь блок.

Переустановите все пакеты в решении:

Update-Package -reinstall

После этого ваши пакеты nuget должны быть восстановлены, я думаю, что это может быть незначительный случай, который происходит только тогда, когда вы перемещаете свой проект в другое место.

Яко Бассон
источник
Это спасло меня от сумасшествия. Спасибо!
Джефф Хей
4

Просто для других, которые могут столкнуться с этой проблемой, я смог решить проблему, закрыв Visual Studio и снова открыв проект. Когда проект был загружен, пакеты были восстановлены на этапе инициализации.

Майк Перренуд
источник
4

Для меня у меня был пустой тег NuGetPackageImportStamp в .csproj

<NuGetPackageImportStamp>
    </NuGetPackageImportStamp>

В идеале он должен содержать некоторый действительный идентификатор GUID.

Удаление вышеупомянутого тега и затем «Восстановление Nugets» работало для меня.

ана
источник
1

Иногда происходит что-то странное, и использование Visual Studio для автоматического восстановления не работает. В этом случае вы можете использовать консоль диспетчера пакетов NuGet. Это открывается в Visual Studio из Сервис -> Диспетчер пакетов NuGet -> Консоль диспетчера пакетов . Команды в консоли просты. А чтобы получить контекстную помощь при вводе команды, просто нажмите кнопку, и она предоставит вам все опции, которые начинаются с букв, которые вы вводите. Поэтому, если пакет не установлен, например, log4net, введите следующую команду:

Инсталляционный пакет log4net

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

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

Джереми Рэй Браун
источник
1

Автоматическое восстановление пакета не будет выполнено по одной из следующих причин:

  1. Вы не удалили файлы NuGet.exe и NuGet.targets из папки решения .nuget (которую можно найти в корневой папке решения)
  2. Вы не включили автоматическое восстановление пакета в меню Инструменты >> Параметры >> Диспетчер пакетов Nuget >> Общие параметры.
  3. Вы забыли вручную удалить ссылки во всех ваших проектах в файл Nuget.targets
  4. Вам нужно перезапустить Visual Studio (убедитесь, что процесс убит из вашего диспетчера задач перед повторным запуском).

В следующей статье более подробно рассказывается, как работать с пунктами 1-3: https://docs.nuget.org/consume/package-restore/migrating-to-automatic-package-restore

CShark
источник
1
Что касается вашего пункта # 1, то указанная вами ссылка противоречит вашему совету: «Если вы используете TFS 1. Удалите файлы NuGet.exe и NuGet.targets из папки решения .nuget 2. Сохраните файл NuGet.Config, чтобы продолжить обходить добавление пакетов в систему контроля версий. "
Эндрю Деннисон,
1

После того, как я восстановил систему в моей системе, у меня сломались пакеты NuGet, и я делал резервные копии примерно два дня. (Тем временем пакеты NuGet были установлены.) Чтобы исправить это, мне пришлось перейти в папку .nuget \ packages в моем профиле пользователя, найти пакеты и удалить их. Только в этом случае Visual Studio будет обновлять пакеты и добавлять их как ссылки.

Аарон
источник
1

Лучший обходной путь, который я нашел, - создать новый проект с нуля, а затем импортировать все исходные файлы с кодом. Мой проект не был таким сложным, поэтому у меня не было никаких проблем.

Мартин Дейвид
источник
1

Ни одно из других решений не сработало в моей ситуации:

Зависимости AspNetCore были установлены / удалены и кэшировались. «AspNetCore.All» откажется корректно обновить / переустановить / удалить. И независимо от того, что я делал, он использовал кэшированные зависимости (с которыми он не был совместим), потому что они были более высокой версией.

  1. Резервное копирование всего. Обратите внимание на список зависимостей, которые вам нужно переустановить, выйдите из VisualStudio
  2. Откройте все файлы .proj в текстовом редакторе и удалите все PackageReference
  3. В каждом проекте, удалить bin,obj папки
  4. Удалите все «пакеты» папки, которые вы найдете в решении.
  5. Откройте решение, зайдите Tools > Nuget Package Manager > Package Manager SettingsиClear all Nuget caches . Проверьте консоль, поскольку она может не удалить некоторые элементы - скопируйте путь к папке и выйдите из Visual Studio.
  6. Удалите что-нибудь из этой папки. Откройте решение и снова начните устанавливать пакеты nuget с нуля.

Если это все еще не работает, повторите, но также найдите ваш диск в проводнике Windows nugetи удалите все, что выглядит кэшированным.

jv_
источник
0

vs2015 no enable проблема восстановления nuget. Мое решение:

  1. добавить папку .nuget, добавить файл NuGet.Config и NuGet.targets в каталог .nuget

  2. каждый файл проекта добавить: построить

  <RestorePackages>true</RestorePackages>

  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
  </Target>
方 权 军
источник
Это старый способ сделать это. См. Ответ @davenewza и его ссылку на blog.davidebbo.com/2014/01/…
timB33
0

Если ошибка, с которой вы столкнулись, это «невозможно подключиться к удаленному серверу», как это было у меня, было бы полезно иметь эту проверку в дополнение к проверкам, приведенным в комментариях выше.

Я увидел, что есть 2 источника пакетов NUGET, из которых можно было загрузить пакеты (в меню «Инструменты» -> «Диспетчер пакетов Nuget» -> «Настройки диспетчера пакетов»). Один из источников пакетов не работал, и Nuget пытался загрузить только из этого источника.

Все стало на свои места после того, как я изменил исходный код пакета для загрузки с: https://www.nuget.org/api/v2/ ЯСНО в настройках

vamsee
источник
0

В моем случае прерванная попытка восстановления Nuget повредила один из packages.configфайлов в решении. Я не обнаружил это до проверки моего рабочего дерева git. После отмены изменений в файле восстановление Nuget снова заработало.

Фредерик Струк-Шёнинг
источник
0

Существует ярлык для восстановления Nuget: 1. Убедитесь, что интернет-соединение или URL-адреса Nuget указаны в меню параметров VS Tools. 2. Посмотрите на папку .nuget или nuget в решении, иначе - скопируйте из любого файла, чтобы получить nuget.exe.

  1. УДАЛИТЬ пакеты папок, если существует

  2. Откройте консоль диспетчера пакетов и выполните эту команду

    • вставить полный путь к nuget.exe ВОССТАНОВИТЬ полный путь к файлу .sln!
  3. используйте команду Install-pacakge, если сборка не прошла для отсутствующих ссылок. Надеюсь, что это помогает (HIH)
HydTechie
источник
0

В VS2017 щелкните правой кнопкой мыши решение => Открыть CommandLine => Командная строка разработчика.

Как только это откроется, введите (и нажмите ввод после)

dotnet restore

Это восстановит все / все пакеты, и вы получите хороший консольный вывод о том, что было сделано ...

Джеймс Джойс
источник