Связь между dotnet cli и новым vs2017 msbuild

С переходом от project.json к новому формату csproj, представленному с VS2017, я изо всех сил пытаюсь понять разницу между dotnet cli и новым msbuild и когда использовать один над другим.

1) Чтобы создать новую библиотеку netstandard csproj из командной строки, следует ли мне обращаться к dotnet cli (например, dotnet restore dotnet build) или использовать msbuild (например, msbuild ExampleNetstandard.sln).

2) Также я понимаю, что существуют две версии msbuild, одна из которых построена на полной структуре и другая таргетинг dotnet core. Это верно? Должен ли я всегда использовать dotnet version

3) Является ли dotnet cli автономным или требуется установка msbuild?. Например, когда вы устанавливаете dotnet SDK, это также устанавливает msbuild? Если это так отличается от версии, установленной с vs2017?

Ответы

Ответ 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"

Если вы удалите это, есть доказательство:

When msbuild.dll removed

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

msbuild.dll properties of SDK 1.0.3

Некоторый код

Если вы посмотрите на код 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, смотрите сравнение

PS нет таблиц уценки в SO :(