Ссылки на сборки Visual Studio Nuget не работают при перемещении проектов - PullRequest
2 голосов
/ 18 июня 2019

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

Итак, я попытался скопировать папку NuGet «packages» в папку, ближайшую к файлу csproj, и обновил HintPath, чтобы он указывал на новое местоположение, и ... Он волшебным образом исправлен!

Например:

Это не работает:

<HintPath>..\..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Razor.dll</HintPath>

Это отлично работает:

<HintPath>..\packages\Microsoft.AspNet.WebPages.3.2.7\lib\net45\System.Web.WebPages.Razor.dll</HintPath>

Кто-нибудь еще испытывал такое поведение? Как правильно структурировать решения, которые совместно используют общие проекты, не попадая в эту надоедливую проблему? Есть ли лучшая практика?

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

1 Ответ

3 голосов
/ 24 июня 2019

HintPath добавляется в ваш файл .csproj, когда вы ссылаетесь на пакет Nuget. Как следует из названия, это подсказка для компилятора, указывающего, где искать сборку, в виде относительной ссылки на папку Nuget Packages.

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

Самый простой способ решить эту проблему - это перейти от packages.config к более новому формату управления пакетами PackageReference. Это записывает ваши ссылки Nuget как ссылки на пакеты, а не ссылки на сборки, и удаляет все записи 'HintPath' .

Вы можете включить это в параметрах диспетчера пакетов Nuget в Visual Studio. Следующий снимок экрана взят из Visual Studio 2019:

enter image description here

Скопируйте обе мои настройки из «Управления пакетами».

Чтобы перенести существующий проект, щелкните правой кнопкой мыши узел References или файл packages.config в обозревателе решений и выберите «Перенос пакетов.config в PackageReference» [полные инструкции] .

Если по какой-либо причине вышеприведенное невозможно (например, вы используете старую версию Visual Studio), существует сценарий msbuild с именем HintPathOverwrite, доступный на GitHub и Nuget который может динамически изменять HintPath во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...