Я пытаюсь создать решение с packages
отсутствующим содержимым (кроме repositories.config
внутреннего) с помощью MSBuild 12.0. Я ожидаю, что он автоматически восстановит все отсутствующие пакеты перед сборкой, но это не так - MsBuild сообщает о множестве ошибок:
"вам не хватает директивы using или ссылки на сборку?"
NuGet Manager - 2,7 (я вижу это в окне о Visual Studio 2013). Я даже пытался передать EnableNuGetPackageRestore=true
параметр - не повезло. Что мне не хватает?
Ответы:
ОБНОВЛЕНО последней официальной документацией NuGet от v3.3.0
Подходы к восстановлению пакетов
источник
Если вы используете Visual Studio 2017 или более поздней версии,
PackageReference
которая поставляется с MSBuild 15 или более поздней версии , и ваши файлы .csproj находятся в новом формате , самый простой способ - использовать новуюRestore
цель MSBuild .На самом деле никто не ответил на исходный вопрос: «Как мне заставить пакеты NuGet автоматически восстанавливаться при сборке из командной строки с помощью MSBuild?» Ответ: если вы не используете параметр «Включить восстановление пакета NuGet» (который теперь не рекомендуется в соответствии с этой ссылкой ), вы не можете (но см. Ниже). Если вы пытаетесь выполнить, например, автоматическую сборку на сервере CI, это отстой.
Однако есть несколько окольный способ добиться желаемого поведения:
nuget restore
который автоматически загрузит все недостающие пакеты.msbuild
чтобы построить свое решение.Кроме того: хотя новый и рекомендуемый способ выполнения автоматического восстановления пакетов включает меньше беспорядка в вашем управлении версиями, он также делает невозможным восстановление пакета из командной строки, если вы не перескочите через дополнительную обручу загрузки и запуска
nuget.exe
. Прогресс?источник
nuget.exe
в / trunk / ext). Один шаг вперед - два шага назад :(Автоматическое восстановление пакетов Nuget - это функция Visual Studio (начиная с 2013 года), а не MSBuild. Вам нужно будет запустить,
nuget.exe restore
если вы хотите восстановить пакеты из командной строки.Вы также можете использовать функцию «Включить восстановление пакета Nuget», но это больше не рекомендуется разработчиками nuget, поскольку она вносит навязчивые изменения в файлы проекта и может вызвать проблемы, если вы создадите эти проекты в другом решении.
источник
Мне потребовалось время, чтобы понять всю картину, и я хотел бы поделиться здесь.
В Visual Studio есть два подхода к использованию восстановления пакетов: автоматическое восстановление пакета и восстановление пакета, интегрированное с MSBuild. «MSBuild-Integrated Package Restore» восстанавливает пакеты ВО ВРЕМЯ процесса сборки, что может вызвать проблемы в некоторых сценариях. Команда NuGet рекомендует «автоматическое восстановление пакета ».
Чтобы заставить «Автоматическое восстановление пакета» работать, нужно выполнить несколько шагов:
В Visual Studio Инструменты -> Расширения и обновления, Обновите NuGet, если есть более новая версия (Версия 2.7 или новее).
Если вы используете TFS, в папке .nuget вашего решения удалите файлы NuGet.exe и NuGet.targes. Затем отредактируйте NuGet.Config, чтобы не проверять пакеты NuGet:
Если вы ранее проверили папку пакетов решения в TFS, удалите папку и отметьте удаление удаления папки пакета.
Если вы не используете TFS, удалите папку .nuget.
В каждом файле проекта (.csproj или .vbproj) вашего решения удалите строку, которая ссылается на файл NuGet.targets. Ссылка выглядит так:
Удалите эту строку из каждого файла проекта в своем решении.
В меню Visual Studio либо через
Инструменты -> Параметры -> Диспетчер пакетов -> Общие или Инструменты -> Диспетчер пакетов NuGet -> Параметры диспетчера пакетов
включите следующие два параметра: 1) «Разрешить NuGet загружать отсутствующие пакеты» 2) «Автоматически проверять отсутствие пакетов во время сборки в Visual Studio»
Проверьте конфигурацию восстановления пакета, выполнив следующие действия.
источник
В MSBuild 15 есть параметр / t: restore для этого. он поставляется с Visual Studio 2017.
Если вы хотите использовать это, вам также необходимо использовать новый PackageReference , что означает замену
packages.config
файла такими элементами (сделайте это в * .csproj):Существует автоматическая миграция в этот формат, если вы щелкните правой кнопкой мыши «Ссылки» (он может не отображаться, если вы только что открыли визуальную студию, перестроили или открыли окно «Управление пакетами NuGet для решения», и оно начнет появляться).
источник
У Иэна Кемпа есть ответ (есть кое-что, между прочим ...), это просто добавить немного мяса к одному из своих шагов.
Причина, по которой я оказался здесь, заключалась в том, что машины разработчиков собирались нормально, но сервер сборки просто не извлекал необходимые пакеты (пустая папка пакетов), и поэтому сборка не выполнялась. Однако вход на сервер сборки и сборка решения вручную работали.
Чтобы выполнить второй из трех шагов Ians (выполнение восстановления nuget ), вы можете создать цель MSBuild, запустив команду exec для запуска команды восстановления nuget, как показано ниже (в этом случае nuget.exe находится в папке .nuget, а не на пути), который затем можно запустить на этапе сборки TeamCity (доступны другие CI ...) непосредственно перед сборкой решения.
Для справки, я уже пробовал бегун типа «установщик nuget», но этот шаг зависал в веб-проектах (работал для проектов DLL и Windows).
источник
Обратите внимание, что если вы используете TeamCity в качестве сервера сборки, вы получаете шаг «Установщик NuGet», который можно использовать для восстановления всех пакетов перед шагом сборки.
источник
С проектом есть файл packages.config , он содержит детали пакета.
Также есть папка .nuget, которая содержит NuGet.exe и NuGet.targets . если какой-либо один из файлов отсутствует, он не восстановит отсутствующий пакет и вызовет "вам не хватает директивы using или ссылки на сборку?" ошибка
источник
.nuget
и не было. Всеpackages.config
файлы в папках проекта на месте.Иногда это происходит, когда папка с пакетом, который вы пытаетесь восстановить, находится внутри папки «packages» (например, «Packages / EntityFramework.6.0.0 /» ), но «DLL» не находятся внутри нее (большая часть системы контроля версий системы автоматически игнорируют файлы ".dll"). Это происходит потому, что перед попыткой восстановления каждого пакета NuGet проверяет, существуют ли уже папки, поэтому, если он существует, NuGet предполагает, что «dll» находится внутри него. Поэтому, если это проблема для вас, просто удалите папку, и NuGet восстановит ее правильно.
источник
У меня возникла проблема с пакетами nuget, которые не были включены в ночную сборку со сценарием, которая создает файл sln с помощью devenv.exe.
Я последовал совету Microsoft , и ключевым шагом было обновление конфигурации NuGet,
%AppData%/NuGet
чтобы она содержала:источник
В Visual Studio 2017 - при компиляции с использованием IDE - он загрузит все недостающие пакеты nuget и сохранит их в папке «пакеты».
Но на сборочной машине компиляция производилась с помощью msbuild.exe. В этом случае я загрузил nuget.exe и сохранил путь.
Во время каждого процесса сборки перед запуском msbuild.exe. Он выполнит -> nuget.exe восстановит NAME_OF_SLN_File (если есть только один файл .SLN, вы можете игнорировать этот параметр)
источник
Вы также можете использовать
для восстановления пакетов NuGet в консоли управления пакетами в Visual Studio.
источник