it-swarm.com.ru

Автоматическое восстановление пакета NuGet не работает с MSBuild

Я пытаюсь создать решение с отсутствующим содержимым packages (кроме repositories.config внутри) с MSBuild 12.0. Я ожидаю, что он автоматически восстановит все недостающие пакеты перед сборкой, но это не так - MsBuild сообщает о множестве ошибок: 

"Вы пропустили директиву использования или ссылку на сборку?" 

NuGet Manager - 2.7 (я вижу это в Visual Studio 2013 о коробке). Я даже пытался передать параметр EnableNuGetPackageRestore=true - не повезло. Что мне не хватает?

90
UserControl

ОБНОВЛЕНО последней официальной документацией NuGet от v3.3.0

Подходы к восстановлению пакетов

NuGet предлагает три подхода к использованию восстановление пакета .


Автоматическое восстановление пакетов - рекомендуемый командой NuGet подход к восстановлению пакетов в Visual Studio, который был представлен в NuGet 2.7 . Начиная с NuGet 2.7, расширение NuGet Visual Studio интегрируется в события сборки Visual Studio и восстанавливает отсутствующие пакеты при начале сборки. Эта функция включена по умолчанию, но разработчики могут отказаться при желании.


Вот как это работает:

  1. При сборке проекта или решения Visual Studio вызывает событие, которое Построение начинается в рамках решения. 
  2. NuGet отвечает на это событие и проверяет наличие пакетов package.config, включенных в решение. 
  3. Для каждого найденного файла packages.config перечисляются его пакеты и Проверен на наличие в папке пакетов решения.
  4. Любые отсутствующие пакеты загружаются из настроенных (и включенных) источников пакетов пользователя в соответствии с порядком источников пакетов.
  5. По мере загрузки пакетов они распаковываются в решение папка пакетов.

Если у вас установлен Nuget 2.7+; важно выбрать один метод для> управления автоматическим восстановлением пакетов в Visual Studio.

Доступны два метода:

  1. (Nuget 2.7+): Visual Studio -> Инструменты -> Диспетчер пакетов -> Пакет Настройки менеджера -> Включить автоматическое восстановление пакета 
  2. (Nuget 2.6 и ниже) Щелкните правой кнопкой мыши решение и выберите «Включить пакет Восстановить для этого решения».


Восстановление пакета из командной строки требуется при построении решения из командной строки; он был представлен в ранних версиях NuGet, но был улучшен в NuGet 2.7. 

nuget.exe restore contoso.sln

Восстановление интегрированного пакета MSBuild подход является оригинальной реализацией восстановления пакета и, хотя это продолжает работать во многих сценариях, он не охватывает полный набор сценарии, рассматриваемые двумя другими подходами.

33
KMoraz

Если вы используете Visual Studio 2017, поставляемую с MSBuild 15, и ваши файлы .csproj находятся в новый формат PackageReference, самый простой способ - использовать новую цель MSBuild Restore .


Никто на самом деле не ответил на первоначальный вопрос: «Как я могу получить пакеты NuGet для автоматического восстановления при сборке из командной строки с MSBuild?» Ответ таков: если вы не используете опцию «Включить восстановление пакета NuGet» (которая в настоящее время устарела согласно эта ссылка ), вы не можете (но см. Ниже). Если вы пытаетесь сделать, например, автоматизированная сборка на CI-сервере, это отстой.

Однако есть немного окольный способ получить желаемое поведение:

  1. Загрузите последний исполняемый файл NuGet из https://dist.nuget.org/win-x86-commandline/latest/nuget.exe и поместите его где-нибудь в своей переменной PATH. (Вы можете сделать это как шаг перед сборкой.)
  2. Запустите nuget restore , чтобы автоматически загрузить все отсутствующие пакеты.
  3. Запустите msbuild, чтобы построить свое решение.

Кроме того: хотя новый и рекомендуемый способ автоматического восстановления пакетов включает в себя меньше беспорядка в управлении версиями, он также делает невозможным восстановление пакета командной строки, если вы не перепрыгнете через дополнительный цикл загрузки и запуска nuget.exe. Прогресс?

219
Ian Kemp

Автоматическое восстановление пакетов Nuget - это функция Visual Studio (начиная с 2013 года), а не MSBuild. Вам нужно будет запуститьnuget.exe restore, если вы хотите восстановить пакеты из командной строки. 

Вы также можете использовать функцию «Включить восстановление пакета Nuget», но она больше не рекомендуется для пользователей Nuget, поскольку она вносит навязчивые изменения в файлы проекта и может вызвать проблемы, если вы создаете эти проекты в другом решении. 

54
Owen Johnson

Мне понадобилось некоторое время, чтобы выяснить всю картину, и я хотел бы поделиться здесь. 

В Visual Studio есть два подхода к использованию восстановления пакетов: автоматическое восстановление пакетов и восстановление пакетов с помощью MSBuild. 'MSBuild-Integrated Package Restore' восстанавливает пакеты во время процесса сборки, которые могут вызывать проблемы в некоторых сценариях. «Автоматическое восстановление пакета» является рекомендуемым подходом командой NuGet. 

Есть несколько шагов, чтобы заставить 'Автоматическое Восстановление Пакета' работать: 

  1. В Visual Studio, Инструменты -> Расширения и обновления, обновите NuGet, если есть более новая версия (версия 2.7 или более поздняя)

  2. Если вы используете TFS, в папке вашего решения .nuget удалите файлы NuGet.exe и NuGet.targes. Затем отредактируйте NuGet.Config, чтобы не проверять пакеты NuGet: 

    <configuration>  
      <solution>  
        <add key="disableSourceControlIntegration" value="true" />  
      </solution>  
    </configuration> 
    

    Если вы ранее проверяли папку с пакетами решения на TFS, удалите папку и отметьте удаление папки с пакетами. 

    Если вы не используете TFS, удалите папку .nuget. 

  3. В каждом файле проекта (.csproj или .vbproj) в вашем решении удалите строку, которая ссылается на файл NuGet.targets. Ссылка выглядит так: 

    <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
    

    Удалите эту строку в каждом файле проекта в вашем решении. 

  4. В меню Visual Studio, либо через 

    Сервис -> Параметры -> Диспетчер пакетов -> Общие или Инструменты -> Диспетчер пакетов NuGet -> Настройки диспетчера пакетов

    включите следующие два параметра 1) «Разрешить NuGet загружать отсутствующие пакеты» 2) «Автоматически проверять отсутствующие пакеты во время сборки в Visual Studio»

  5. Проверьте конфигурацию восстановления вашего пакета, выполнив следующие действия

    • Сохраните свое решение и закройте Visual Studio
    • Удалить папку пакетов вашего решения
    • Запустите Visual Studio, откройте свое решение и перестройте его. 
17
Ying

MSBuild 15 имеет параметр /t: restore , который делает это. поставляется с Visual Studio 2017.

Если вы хотите использовать это, вы также должны использовать новый PackageReference , что означает замену файла packages.config такими элементами (сделайте это в * .csproj):

<ItemGroup>
  <!-- ... -->
  <PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.0" />
  <!-- ... -->
</ItemGroup>

Существует автоматический переход к этому формату, если щелкнуть правой кнопкой мыши «Ссылки» (он может не появиться, если вы только что открыли Visual Studio, пересоберите или откроете окно «Управление пакетами NuGet для решения», и оно начнет появляться).

3
Chris

У Иана Кемпа есть ответ (есть несколько моментов между прочим), это просто добавить немного мяса к одному из его шагов.

Причина, по которой я оказался здесь, заключалась в том, что машины dev работали нормально, но сервер сборки просто не собирал требуемые пакеты (пустая папка пакетов), и поэтому сборка не удалась. Однако вход на сервер сборки и сборка решения вручную работали.

Чтобы выполнить второй из трех шагов Ians (запуск nuget restore ), вы можете создать целевой объект MSBuild, выполнив команду exec для запуска команды восстановления nuget, как показано ниже (в данном случае nuget.exe находится в .nuget папку, а не по пути), которая затем может быть запущена на этапе сборки TeamCity (другие доступные элементы конфигурации ...) непосредственно перед созданием решения

<Target Name="BeforeBuild">
  <Exec Command="..\.nuget\nuget restore ..\MySolution.sln"/>
</Target>

К сведению, я уже пробовал использовать тип бегуна «nuget installer», но этот шаг зависал для веб-проектов (работал для проектов DLL и Windows)

3
Fetchez la vache

Обратите внимание, что если вы используете TeamCity в качестве сервера сборки, вы получаете шаг «Установщик NuGet», который можно использовать для восстановления всех пакетов перед этапом сборки.

2
Dejan

Иногда это происходит, когда у вас есть папка с пакетом, который вы пытаетесь восстановить, внутри папки «packages» (т.е. «Packages/EntityFramework.6.0.0 /») но «DLL» не находятся внутри нее. (большинство систем контроля версий автоматически игнорируют файлы ".dll"). Это происходит потому, что перед тем, как NuGet пытается восстановить каждый пакет, он проверяет, существуют ли папки, поэтому, если он существует, NuGet предполагает, что внутри него находится «dll». Так что, если это проблема для вас, просто удалите папку, которую NuGet восстановит правильно.

2
fabriciorissetto

В проекте есть файл packages.config , в котором содержатся сведения о пакете.

Также есть папка .nuget, которая содержит NuGet.exe и NuGet.targets . если какой-либо из файлов отсутствует, он не восстановит отсутствующий пакет и приведет к тому, что «вы пропустили директиву using или ссылку на сборку?» ошибка

2
Sumeshk

У меня была проблема с тем, что пакеты nuget не включались в ночную сборку со сценарием, которая создает файл sln с использованием devenv.exe. 

Я следовал совету от Microsoft , и ключевым шагом было обновление конфигурации NuGet в %AppData%/NuGet, чтобы она содержала:

<configuration>
    <packageRestore>
        <add key="automatic" value="True" />
    </packageRestore>
</configuration>
0
PaulG

В Visual Studio 2017 - при компиляции с использованием IDE - он загрузит все недостающие пакеты nuget и сохранит в папке «пакеты».

Но на сборочной машине компиляция выполнялась с использованием msbuild.exe. В этом случае я скачал nuget.exe и сохранил путь.

Во время каждого процесса сборки перед выполнением msbuild.exe. Он выполнит -> nuget.exe restore NAME_OF_SLN_File (если есть только один файл .SLN, вы можете игнорировать этот параметр)

0
David

Вы также можете использовать

Update-Package -reinstall

восстановить пакеты NuGet на консоли управления пакетами в Visual Studio.

0
MovGP0