Решение 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]()