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

Примечание

Следующий раздел относится к только к пакетам на основе packages.config. В проектах PackageReference поврежденные ссылки исправляются автоматически во время восстановления.

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

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

Обновление и переустановка пакетов выполняются следующим образом:

Метод Update Переустановка
Консоль диспетчера пакетов (описана в разделе Использование команды Update-Package) Команда Update-Package Команда Update-Package -reinstall
Пользовательский интерфейс диспетчера пакетов На вкладке Обновления выберите один или несколько пакетов и затем элемент Обновить На вкладке Установленные выберите пакет, запишите его имя, а затем выберите элемент Удалить. Перейдите на вкладку Обзор, найдите имя пакета, выберите его, а затем выберите элемент Установить.
Интерфейс командной строки nuget.exe Команда nuget update Для всех пакетов удалите папку пакета, а затем запустите nuget install. Для одного пакета удалите папку пакета, а затем используйте nuget install <id> для переустановки того же пакета.

Примечание

Для интерфейса командной строки dotnet такая процедура не требуется. В аналогичном сценарии вы можете восстановить пакеты с помощью интерфейса командной строки dotnet.

Содержание этой статьи

Когда следует переустанавливать пакет

  1. Нарушенные ссылки после восстановления пакета: если вы открыли проект и восстановили пакеты NuGet, но по-прежнему видите нарушенные ссылки, попробуйте переустановить каждый из этих пакетов.
  2. Проект нарушен из-за удаленных файлов: NuGet не запрещает вам удалять элементы, добавленные из пакетов, поэтому вы легко можете случайно изменить содержимое, установленное из пакета, и нарушить работу проекта. Чтобы восстановить проект, переустановите затронутые пакеты.
  3. Обновление пакета нарушило работу проекта. Если обновление пакета нарушает работу проекта, причиной сбоя обычно является пакет зависимостей, который также мог быть обновлен. Чтобы восстановить состояние зависимости, переустановите этот пакет.
  4. Перенацеливание или обновление проекта: это может быть полезно, когда проект был перенацелен или обновлен и если он требует переустановки из-за изменения целевой платформы. В таких случаях NuGet выдает ошибку сборки сразу после перенацеливания проекта, а последующие предупреждения сборки сообщают, что для пакета может потребоваться переустановка. Для обновления проекта NuGet выводит ошибку в журнале обновления проекта.
  5. Переустановка пакета во время его разработки: авторам пакетов часто требуется переустановить ту версию пакета, которую они разрабатывают, для тестирования поведения. Команда Install-Package не предоставляет возможность принудительной переустановки, поэтому используйте вместо нее Update-Package -reinstall.

Ограничение версий для обновления

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

Однако в проектах, использующих формат управления packages.config, вы можете ограничить диапазон версий. Например, если известно, что приложение работает с версией 1.x пакета, но не работает с версией 2.0 и выше, возможно, из-за значительного изменения в API пакета, может потребоваться ограничить обновление версиями 1.x. Это предотвратит случайные обновления, приводящие к сбою приложения.

Чтобы задать ограничение, откройте packages.config в текстовом редакторе, найдите требуемую зависимость и добавьте атрибут allowedVersions с диапазоном версий. Например, чтобы ограничить обновления версией 1.x, задайте для allowedVersions значение [1,2):

<?xml version="1.0" encoding="utf-8"?>
<packages>
    <package id="ExamplePackage" version="1.1.0" allowedVersions="[1,2)" />

    <!-- ... -->
</packages>

Во всех случаях используйте нотацию, описанную в статье Управление версиями пакета.

Использование команды Update-Package

Учитывая описанные ниже особенности, вы можете легко переустановить пакет с помощью команды Update-Package в консоли диспетчера пакетов Visual Studio (Средства>Диспетчер пакетов NuGet>Консоль диспетчера пакетов).

Update-Package -Id <package_name> –reinstall

Воспользоваться этой командой гораздо проще, чем удалить пакет и затем пытаться найти в коллекции NuGet пакет той же версии. Обратите внимание, что параметр -Id является необязательным.

Та же команда без -reinstall обновляет пакет до более новой версии, если это возможно. Команда Update-Package выдает ошибку, если соответствующий пакет не установлен в проекте, то есть эта команда не устанавливает сами пакеты.

Update-Package <package_name>

По умолчанию Update-Package затрагивает все проекты в решении. Чтобы ограничить действие конкретным проектом, используйте параметр -ProjectName, указав имя проекта в том виде, в котором оно отображается в обозревателе решений:

# Reinstall the package in just MyProject
Update-Package <package_name> -ProjectName MyProject -reinstall

Чтобы обновить все пакеты в проекте (или переустановить с помощью -reinstall), используйте -ProjectName без указания конкретного пакета:

Update-Package -ProjectName MyProject

Чтобы обновить все пакеты в решении, используйте только команду Update-Package без аргументов или параметров. Используйте эту форму осторожно, так как выполнение всех обновлений может занимать много времени:

# Updates all packages in all projects in the solution
Update-Package 

При обновлении пакетов в проекте или решении с помощью PackageReference всегда применяется последняя версия пакета (кроме пакетов предварительного выпуска). Проекты, использующие packages.config, при необходимости могут ограничить версии обновления, как описано ниже в разделе Ограничение версий для обновления.

Дополнительные сведения о команде см. по ссылке Update-Package.

Рекомендации

Переустановка пакета может повлиять на следующее:

  1. Переустановка пакетов в результате перенацеливания целевой платформы проекта

    • В простом случае можно выполнить переустановку пакета с помощью Update-Package –reinstall <package_name>. Пакет, установленный для старой целевой платформы, удаляется, после чего устанавливается тот же самый пакет для текущей целевой версии проекта.
    • В некоторых случаях пакет может не поддерживать новую целевую платформу.
      • Если пакет поддерживает переносимые библиотеки классов (PCL), а проект перенацеливается на сочетание платформ, которое больше не поддерживается пакетом, после переустановки ссылки на этот пакет будут отсутствовать.
      • Это может касаться пакетов, которые вы используете напрямую, или пакетов, установленных в качестве зависимостей. Используемый напрямую пакет может поддерживать новую целевую платформу, а его зависимость — нет.
      • Если переустановка пакетов после перенацеливания приложения приводит к ошибкам сборки или времени выполнения, может потребоваться отменить изменение целевой платформы или найти альтернативные пакеты, должным образом поддерживающие новую целевую платформу.
  2. Добавление атрибута requireReinstallation в файл packages.config после обновления или перенацеливания проекта

    • Если NuGet обнаруживает, что пакеты были затронуты при перенацеливании или обновлении проекта, он добавляет атрибут requireReinstallation="true" в packages.config для всех затронутых ссылок на пакет. По этой причине каждая последующая сборка в Visual Studio вызывает предупреждения сборки для пакетов, чтобы вы не забыли переустановить их.
  3. Переустановка пакетов с зависимостями

    • Update-Package –reinstall переустанавливает ту же версию исходного пакета, но устанавливает последнюю версию зависимостей, если только не заданы определенные ограничения по версии. Это позволяет обновить только зависимости, чтобы устранить ошибку. Однако, если при этом зависимость откатывается до более ранней версии, можно использовать Update-Package <dependency_name>, чтобы переустановить эту отдельную зависимость, не затрагивая зависимый пакет.
    • Update-Package –reinstall <packageName> -ignoreDependencies переустанавливает ту же версию исходного пакета, но не переустанавливает зависимости. Используйте эту команду, когда обновление зависимостей пакетов может привести к нарушению состояния.
  4. Переустановка пакетов при использовании зависимых версий

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