Решение Retargeting от .Net 4.0 до 4.5 - как перенацелить пакеты NuGet?

Я перенесла решение, которое в настоящее время нацелено на .NET 4.0 в VS2010 на VS2012, и теперь я хотел бы перенаправить его на .Net 4.5

Я не уверен, что это пакеты NuGet. Например, EF5, который я обновил из EF4 в VS2010, оказывается фактически EF 4.4, как вы можете видеть здесь:

    <Reference Include="EntityFramework, Version=4.4.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL">
      <SpecificVersion>False</SpecificVersion>
      <HintPath>..\packages\EntityFramework.5.0.0\lib\net40\EntityFramework.dll</HintPath>
    </Reference>

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

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="EntityFramework" version="5.0.0" targetFramework="net40" />
</packages>

Итак, мой вопрос:

Какова наилучшая практика переназначения всех пакетов NuGet, которые в настоящее время настроены на целевой .NET 4.0 для целевой .NET 4.5?

Ответ 1

NuGet 2.1 предлагает функцию, которая делает это намного проще: просто update-package -reinstall -ignoreDependencies из консоли диспетчера пакетов.

NuGet 2.0 не очень хорошо перенаправляет ваши приложения. Чтобы изменить целевые структуры пакетов, вы должны удалить и переустановить пакеты (принимая во внимание пакеты, которые вы установили, чтобы вы могли переустановить их).

Пакеты причин необходимо удалить и переустановить:

  • При установке пакета мы определяем целевую структуру вашего проекта.
  • Затем мы сопоставляем это с содержимым пакета, находя нужную папку\lib\(и\content \)
  • Ссылки на сборку добавляются с помощью Hint Paths, указывающих на папку\lib\с правой подпапкой (например,\lib\net40)
  • Файлы содержимого копируются из папки \content\folder с правой подпапкой (например,\content\net40)
  • Мы записываем targetFramework, используемый для установки пакета в файле packages.config.
  • После того, как вы изменили целевую структуру проекта, контуры подсказок по-прежнему указывают на net40
  • Когда вы удаляете пакеты, мы проверяем targetFramework, которая была записана в файле packages.config, чтобы узнать, какие целевые среды libs/content удалить из вашего проекта.
  • При переустановке пакета мы обнаруживаем обновленную целевую структуру и ссылаемся/копируем права libs/content

Ответ 2

Для тех, у кого были проблемы с командой update-package -reinstall <packagename>, рассмотрите возможность запуска с флагом -ignoreDependencies, например:

update-package -reinstall <packagename> -ignoreDependencies

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

Подробнее здесь.

Ответ 3

После неудачного ответа на принятый ответ я хотел бы предложить менее рискованную команду:

Update-Package <PackageName> -ProjectName <ProjectName> -Reinstall -IgnoreDependencies

Для получения дополнительной информации: http://blog.nuget.org/20121231/a-quick-tutorial-on-update-package-command.html

Ответ 4

При попытке переустановить решение для решения проблемы, я столкнулся с ошибкой зависимостей (несмотря на использование флага -ignoreDependencies), и все файлы packages.config для каждого проекта были удалены. В VS2013 кажется, что package.config не сбрасывается на диск и повторно добавляется до тех пор, пока все обновленные зависимости/ссылки не будут привязаны к проекту.

В моем случае то, что работало, заключалось в том, чтобы каждый проект обновлять каждый проект, добавляя имя проекта -ProjectName в команду update-package. В этом случае update.config обновляется по мере обновления каждого проекта.

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

Ответ 5

В Visual Studio для Mac 2019 при щелчке правой кнопкой мыши по папке "Пакеты" в меню отображается пункт "Ретаргетинг". Это решило проблему ретаргетинга для всех пакетов в проекте, которые требовали ретаргетинга. Похоже, что в меню "Инструменты" в Visual Studio для Mac не было диспетчера пакетов NuGet (по крайней мере, у меня), поэтому я не смог запустить консоль диспетчера пакетов.

Retarget menu option under Packages right-click menu