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


88

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

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

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

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

Ответы:


148

Вопросов

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.dll на самом деле является msbuild.exe, как вы можете видеть в свойствах:

msbuild.dll свойства SDK 1.0.3

Какой-то код

Если вы посмотрите на код интерфейса командной строки 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, поэтому я не думаю, что вы можете сказать «оба в порядке», не добавив немного контекста. Остальные детали выглядят неплохо.
Лекс Ли

5
msbuild /t:restoreэто новое восстановление. Показал с кодом. Это новый (как раньше dotnetбыло не с помощью MSBuild)
Julian

Отличный ответ .. У меня есть еще один вопрос (я обновил исходный вопрос). Если бы вы могли ответить, я был бы очень признателен и приму ваш ответ
kimsagro

Хороший вопрос. Я не был уверен и проверил это. Вывод: используется собственный msbuild.dll. Обновил пост.
Джулиан
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.