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


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

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

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

11 84

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. для каждого пакета.найден конфигурационный файл, перечислены его пакеты и Проверено на наличие в папке пакетов решения.
  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. Вам придется бежать nuget.exe restore Если вы хотите восстановить пакеты из командной строки.

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

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

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

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

  1. в Visual Studio, Tools - > Extensions and Updates, обновите NuGet, если есть более новая версия (версия 2.7 или более поздняя)

  2. Если вы используете TFS ,в вашем решении.из NuGet папку, удалить из NuGet.exe и NuGet.таргес файлы. Затем отредактируйте NuGet.Конфигурация, чтобы не проверять пакеты 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 point (running nuget восстановить), вы можете создать цель MSBuild, запустив команду exec для запуска команды NuGet restore, как показано ниже (в данном случае nuget.exe находится в the .папка nuget, а не по пути), которая затем может быть запущена на этапе сборки TeamCity (доступны другие КЭ...) непосредственно перед построением решения

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

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

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

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

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

иногда это происходит, когда у вас есть папка пакета, который вы пытаетесь восстановить внутри папки "пакеты" (т. е. " Packages / 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.ехе и держал в пути.

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

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

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

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