it-roy-ru.com

Восстановление всех пакетов Nuget в решении Visual Studio 2015

Я прочитал многие ответы на SO и NuGet (и вообще на Интернете), но я не могу решить проблему, возникающую при восстановлении пакетов NuGet в Visual Studio 2015. У меня есть следующие сценарии. 

Решение А Структура

--Проект А

Если я открываю и собираю Решение A, я вижу диалоговое окно, в котором отображается ход восстановления пакета nuget, и решение успешно собирается.

Структура решения B

--Проект А

- Проект Б

Тем не менее, если предположить, что я никогда не создавал Решение A (т. Е. Заново извлекать из TFS), если я открываю и собираю Решение B, я вижу диалоговое окно, в котором отображается ход восстановления пакета nuget, но сборка завершается неудачно, потому что Проект A не удается собрать. 

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

Несколько моментов:

  • Я отключил интеграцию управления исходным кодом для NuGet, поэтому я не проверяю папку Packages.
  • Каждый проект имеет свой собственный файл packages.config
  • Порядок сборки в решении B - это проект A, а затем проект B

Мысли будут с благодарностью. 

4
dparsons

По умолчанию NuGet создает папку packages решения в корне решения, и каждый проект ссылается своими DLL-пакетами на эту «локальную» папку пакетов. В вашем примере, если вы откроете файл .csproj для проекта A, вы, вероятно, увидите, что путь ссылки - это что-то вроде ..\packages\[package name]\[etc].

Поэтому, когда вы делаете новый выбор из TFS и создаете решение B, Project A не может найти свои DLL, потому что c:\workspace\Solution A\packages еще не существует (или каков бы ни был абсолютный путь на вашей машине). 

Чтобы исправить это, используйте общую папку пакета, созданную в c:\workspace\packages. Чтобы сделать это, вы должны добавить дополнительный узел к NuGet.config в каждом решении (подробнее см. https://docs.nuget.org/consume/nuget-config-file ; также я предполагаю, что вы иметь папку NuGet в c:\workspace\Solution A\.nuget):

<config>
  <add key="repositorypath" value="..\..\packages" />
</config>

Я использовал относительный путь здесь, но вы также можете использовать абсолютный путь, и в документации сказано, что вы также можете использовать %HOME%.

Сделайте это, затем перезапустите Visual Studio. В следующий раз, когда вы откроете менеджер пакетов, он должен спросить вас, хотите ли вы восстановить отсутствующие пакеты, и, если вы нажмете «да», он поместит их в новое место. Последний шаг - отредактировать файл .csproj и изменить все экземпляры ..\packages на ..\..\packages (или вы можете удалить и переустановить пакет, но я считаю, что редактирование .csproj намного быстрее).

5
howcheng

Чтобы восстановить пакеты nuget, выполните следующие действия:

  • Изменить целевую структуру в свойствах проекта
  • Чистый проект
  • Установить предыдущую целевую структуру
  • Перестроить проект

Надеюсь, это поможет.

2
B.Kosmowski

Взято из вопроса ОП

ответ Howcheng , как правило, правильно с некоторыми оговорками. После внесения изменений, предложенных howcheng, я смог построить все свои решения локально, используя центральные папки «пакетов», которые просматривают все проекты, независимо от решения. Проблема, с которой я столкнулся, заключалась в том, что когда я зарегистрировал эти изменения в TFS, моя сборка CI стартовала и не удалась!

My CI Build Definition создает решение A и решение B как часть шаблона процесса XAML по умолчанию, а не файла .proj. Похоже, ошибки, которые я видел, указывали на то, что Решение A восстанавливало свои пакеты, а Решение B - нет. Если я вошел на сервер сборки и открыл Solution B в VS 2015, все работало нормально; после нескольких часов поиска в Google я наткнулся на это статью, которая привела меня к моему ответу.

Я занимаюсь разработкой в ​​Visual Studio 2015, но я использую TFS 2013 для контроля версий и сборок. Несмотря на то, что у меня установлена ​​Visual Studio 2015 на сервере сборки, MSBuild по-прежнему ссылается на версию NuGet, поставляемую с TFS 2013, а НЕ на версию, включенную в VS 2015. После запуска nuget update -self из каталога TFS Tools моя сборка работала правильно , 

0
Liam