Ответ 1
И nuget restore
dotnet restore
примерно одинаковы: они выполняют операцию восстановления NuGet.
Единственное отличие: dotnet restore
- это удобная оболочка для вызова dotnet msbuild/t:Restore
которая вызывает восстановление, интегрированное в MSBuild. Это работает только в дистрибутивах MSBuild, которые включают NuGet, таких как Visual Studio 2017 (полный Visual Studio, инструменты сборки) или Mono 5. 2+ (=> msbuild/t:Restore
) и .NET Core SDK, который предоставляет эту удобную команду,
На данный момент существует два способа использования пакетов NuGet в проектах (на самом деле три, но на данный момент давайте проигнорируем project.json
в UWP):
-
packages.config
: "классический" способ ссылки на пакеты NuGet. Это предполагает, что NuGet - это отдельный инструмент, а MSBuild ничего не знает о NuGet. Клиент NuGet, такой какnuget.exe
или инструменты, интегрированные с Visual Studio, видит файлpackages.config
и загружает указанные пакеты в локальную папку при восстановлении. Установка пакета изменяет проект для ссылки на ресурсы из этой локальной папки. Таким образом, восстановление для проектаpackages.config
загружает только файлы. -
PackageReference
: проект содержит элементы MSBuild, которые ссылаются на пакет NuGet. В отличие отpackages.config
, перечислены только прямые зависимости, и файл проекта напрямую не ссылается на какие-либо ресурсы (файлы DLL, файлы содержимого) из пакетов. При восстановлении NuGet вычисляет граф зависимостей, оценивая прямые и транзитивные зависимости, следит за тем, чтобы все пакеты загружались в глобальный кэш пакетов пользователя (не для локального решения, поэтому он загружается только один раз), и записывает файл ресурсов в папкуobj
он содержит список всех пакетов и ресурсов, которые использует проект, а также дополнительные цели MSBuild, если какой-либо пакет содержит логику сборки, которую необходимо добавить в проект. Таким образом, восстановление NuGet может загружать пакеты, если их еще нет в глобальном кэше, и создавать этот файл ресурсов. В дополнение к ссылкам на пакеты, проект может также ссылаться на инструменты CLI, которые представляют собой пакеты NuGet, содержащие дополнительные команды, которые будут доступны дляdotnet
в каталоге проекта.
Интегрированное с msbuild восстановление работает только для проектов типа PackageReference
(.NET Standard,.NET Core по умолчанию, но оно включено для любого проекта .NET), но не для проектов packages.config
. Если вы используете новую версию nuget.exe
(например, 4.3.0), он может восстановить оба типа проектов.
Ваша ошибка, связанная с отсутствующими типами, немного интереснее: "эталонные сборки" (библиотеки, которые передаются в качестве входных данных компилятору) не устанавливаются в системе, а поступают через пакеты NuGet. Поэтому до тех пор, пока пакеты NuGet отсутствуют в глобальном кэше пакетов или файл obj/project.assets.json
не был сгенерирован операцией восстановления, фундаментальные типы, такие как System.Object
, не будут доступны компилятору.