Вопросов
1) Чтобы создать новую библиотеку csproj netstandard из командной строки, следует ли мне вызывать dotnet cli (например, dotnet restore dotnet build) или использовать msbuild (например, msbuild ExampleNetstandard.sln).
Оба работают нормально, поскольку в настоящее время dotnetпостроены поверх msbuild. Так что дело вкуса. Вы также можете вызывать задачи msbuild с помощью интерфейса командной строки dotnet. ( dotnet msbuild <msbuild_arguments>)
Вначале все, что связано с ядром .NET, было только внутри, dotnetа не внутри msbuild. Это было громоздко, поскольку многие вещи, которые уже были созданы, msbuildне работали хорошо dotnetиз коробки (например, Xamarin). Итак, они переместили материал msbuildи надстроили dotnetего msbuild.
dotnetесть некоторые функции, которых нет msbuild, например dotnet new. На мой взгляд, dotnetпроще в использовании msbuild, поэтому я предпочитаю dotnet.
Чтобы было понятнее, я добавил сравнение между msbuildи dotnetв конце моего сообщения.
2) Кроме того, насколько я понимаю, существует две версии msbuild: одна построена на полной платформе, а другая нацелена на ядро dotnet. Это верно? Должен ли я всегда использовать версию dotnet
Есть только один msbuild. dotnet CLI использует msbuild:
Поскольку CLI использует MSBuild в качестве механизма сборки, мы рекомендуем, чтобы эти части инструмента были написаны как пользовательские цели и задачи MSBuild, поскольку они могут затем участвовать в общем процессе сборки.
https://docs.microsoft.com/en-us/dotnet/articles/core/tools/extensibility
В более старой версии не msbuildбыло поддержки .NET Core. Может это другая версия;)
Я согласен, это сбивает с толку, так как несколько месяцев назад все было по-другому.
3) Является ли dotnet cli автономным или требуется установка msbuild ?. Например, при установке пакета SDK для dotnet это также устанавливает msbuild? Если да, отличается ли эта версия от версии, установленной с vs2017?
Я не был уверен в этом, но это было легко проверить. Я удалил весь файл msbuild.exe, и он все еще работал. Выяснилось, что он использует msbuild.dll в папке SDK. например, "C: \ Program Files \ dotnet \ sdk \ 1.0.3 \ MSBuild.dll"
Если вы удалите его, будет доказательство:

msbuild.dll на самом деле является msbuild.exe, как вы можете видеть в свойствах:

Какой-то код
Если вы посмотрите на код интерфейса командной строки dotnet, вы увидите, что он генерирует msbuildкоманды.
Например dotnet restore, создается RestoreCommandклассом внутри интерфейса командной строки dotnet .
Урезанная версия:
public class RestoreCommand : MSBuildForwardingApp
{
...
public static RestoreCommand FromArgs(string[] args, string msbuildPath = null)
{
var result = parser.ParseFrom("dotnet restore", args);
...
var msbuildArgs = new List<string>
{
"/NoLogo",
"/t:Restore",
"/ConsoleLoggerParameters:Verbosity=Minimal"
};
...
return new RestoreCommand(msbuildArgs, msbuildPath);
}
public static int Run(string[] args)
{
RestoreCommand cmd;
try
{
cmd = FromArgs(args);
}
catch (CommandCreationException e)
{
return e.ExitCode;
}
return cmd.Execute();
}
...
}
Вы можете видеть dotnet restore, просто звонитmsbuild /NoLogo /t:Restore /ConsoleLoggerParameters:Verbosity=Minimal
Если вы проверяете RestoreCommandвремяdotnet v1.0.0 RC2 , он не использовал, msbuildа звонил nugetнапрямую.
return NuGet3.Restore(args, quiet);
Сопоставление между dotnetиmsbuild
Я сделал сопоставление между dotnetи msbuild. Он не полный, но важные команды есть.
Dotnet | Msbuild | Remarks
-----------------------|--------------------------------------------|---------------------------------
Add | |
-----------------------|--------------------------------------------|---------------------------------
Build | /t:Build |
-----------------------|--------------------------------------------|---------------------------------
Build --no-incremental | /t:Rebuild |
-----------------------|--------------------------------------------|---------------------------------
Clean | /t:clean |
-----------------------|--------------------------------------------|---------------------------------
Complete | |
-----------------------|--------------------------------------------|---------------------------------
Help | | Help!
-----------------------|--------------------------------------------|---------------------------------
List | |
-----------------------|--------------------------------------------|---------------------------------
Migrate | - |
-----------------------|--------------------------------------------|---------------------------------
Msbuild | | Forwarding all
-----------------------|--------------------------------------------|---------------------------------
New | |
-----------------------|--------------------------------------------|---------------------------------
Nuget | | *
-----------------------|--------------------------------------------|---------------------------------
Pack | /t:pack |
-----------------------|--------------------------------------------|---------------------------------
Publish | /t:publish |
-----------------------|--------------------------------------------|---------------------------------
Remove | |
-----------------------|--------------------------------------------|---------------------------------
Restore | /NoLogo /t:Restore |
/ConsoleLoggerParameters:Verbosity=Minimal |
-----------------------|--------------------------------------------|---------------------------------
Run | /nologo /verbosity:quiet |
/p:Configuration= /p:TargetFramework |
-----------------------|--------------------------------------------|---------------------------------
Sln | | Not in msbuild
-----------------------|--------------------------------------------|---------------------------------
Store | /t:ComposeStore |
-----------------------|--------------------------------------------|---------------------------------
Test | /t:VSTest /v:quiet /nologo |
-----------------------|--------------------------------------------|---------------------------------
Vstest | | Forwarding to vstest.console.dll
*dotnet nuget: добавление / удаление пакетов в csproj, также ограниченный набор nuget.exe, см. сравнение
PS нет таблиц уценки в SO :(
msbuildне восстанавливает пакеты NuGet, поэтому я не думаю, что вы можете сказать «оба в порядке», не добавив немного контекста. Остальные детали выглядят неплохо.