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