NuGet auto package restore не работает с MSBuild

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

"отсутствует помощью директивы или ссылку на сборку?"

NuGet Manager-2.7 (я вижу это в Visual Studio 2013 о коробке). Я даже пытался пройти

11 ответов


обновлено с последней официальной документацией NuGet по состоянию на v3.3.0

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

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


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


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

  1. при построении проекта или решения Visual Studio вызывает событие, которое сборка начинается в решении.
  2. NuGet отвечает на это событие и проверяет пакеты.файлы конфигурации, включенные в решение.
  3. для каждого пакета.файл конфигурации найден, его пакеты перечислены и Проверено на наличие в папке packages решения.
  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 подход-это оригинальная реализация восстановления пакета и хотя это продолжает работать во многих сценариях, не охватывает полный набор сценарии, рассматриваемые двумя другими подходами.


если вы используете Visual Studio 2017, который поставляется с MSBuild 15,и ваш .файлы csproj в новая


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

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


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

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

есть несколько шаги, чтобы сделать "автоматическое восстановление пакета" работа:

  1. в Visual Studio, Tools - > Extensions and Updates обновите 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.целевой файл. Ссылка выглядит так:

    <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 откройте решение и восстановить его.

у Яна Кемпа есть ответ (есть некоторые моменты кстати..), это просто добавить немного мяса к одному из его шагов.

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

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

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

для записи я уже пробовал тип runner "NuGet installer", но этот шаг висел на веб-проектах (работал для проектов DLL и Windows)


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

тоже есть .папка nuget, которая содержит NuGet.exe и NuGet.цели. если какой-либо из файлов отсутствует, он не восстановит отсутствующий пакет и вызовет "отсутствует директива using или ссылка на сборку?- ошибка!--3-->


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


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


MSBuild 15 имеет / t:опция восстановления что делает это. он поставляется с Visual Studio 2017.

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

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

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

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

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


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

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

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