Relacja między dotnet cli a nowym MSBuild vs2017

89

Po przejściu z project.jsonnowego csprojformatu wprowadzonego wraz z VS2017, staram się zrozumieć różnicę między dotnetCLI a nowym msbuildi kiedy używać jednego nad drugim.

1) Aby zbudować nową csprojbibliotekę netstandard z wiersza poleceń, powinienem dzwonić do dotnetCLI (na przykład dotnet restore dotnet build), czy używać msbuild(na przykład msbuild ExampleNetstandard.sln).

2) Rozumiem również, że istnieją dwie wersje msbuild, jedna oparta na pełnym frameworku, a druga z przeznaczeniem dotnet core. Czy to jest poprawne? Czy powinienem zawsze używaćdotnet version

3) Czy jest dotnet clisamodzielny czy wymaga msbuildinstalacji ?. Na przykład, czy podczas instalowania zestawu SDK dotnet ten program również instaluje msbuild? Jeśli tak, to czy ta wersja różni się od wersji zainstalowanej z vs2017?

kimsagro
źródło

Odpowiedzi:

148

pytania

1) Aby zbudować nową bibliotekę csproj netstandard z wiersza polecenia, czy powinienem wywoływać dotnet cli (na przykład dotnet restore dotnet build), czy użyć msbuild (na przykład msbuild ExampleNetstandard.sln).

Oba radzą sobie dobrze, ponieważ obecnie dotnetjest zbudowany na szczycie msbuild. Więc to kwestia gustu. Możesz również wywołać zadania MSBuild przy użyciu interfejsu wiersza polecenia dotnet. ( dotnet msbuild <msbuild_arguments>)

Na początku wszystkie podstawowe elementy .NET były tylko dostępne, dotneta nie msbuild. Było to uciążliwe, ponieważ wiele rzeczy, które zostały już zbudowane, msbuildnie działało dobrze po dotnetwyjęciu z pudełka (np. Xamarin). Więc przenieśli się do rzeczy msbuildi zbudować dotnetna szczycie msbuild.

dotnetma pewne funkcje, których nie ma msbuild, na przykład dotnet new. Moim zdaniem dotnetjest łatwiejszy w obsłudze niż msbuildtak wolę dotnet.

Aby było to bardziej zrozumiałe, dodałem porównanie między msbuildi dotnetna końcu mojego postu.

2) Rozumiem również, że istnieją dwie wersje msbuild, jedna oparta na pełnej strukturze, a druga przeznaczona dla dotnet core. Czy to jest poprawne? Czy zawsze powinienem używać wersji dotnet

Jest tylko jeden plik msbuild. dotnet CLI używa msbuild:

Ponieważ interfejs wiersza polecenia używa programu MSBuild jako aparatu kompilacji, zalecamy, aby te części narzędzia były zapisywane jako niestandardowe cele i zadania programu MSBuild, ponieważ mogą one następnie brać udział w ogólnym procesie kompilacji

https://docs.microsoft.com/en-us/dotnet/articles/core/tools/extensibility

W starszej wersji msbuildbrakowało obsługi .NET Core. Może to inna wersja;)

Zgadzam się, że to zagmatwane, ponieważ kilka miesięcy temu było zupełnie inaczej.

3) Czy dotnet cli jest autonomiczny, czy wymaga zainstalowania programu MSBuild ?. Na przykład, czy podczas instalowania zestawu SDK dotnet ten program również instaluje msbuild? Jeśli tak, to czy ta wersja różni się od wersji zainstalowanej z vs2017?

Nie byłem tego pewien, ale łatwo było to sprawdzić. Usunąłem cały msbuild.exe i nadal działał. Okazało się, że używa msbuild.dll w folderze SDK. np. „C: \ Program Files \ dotnet \ sdk \ 1.0.3 \ MSBuild.dll”

Jeśli go usuniesz, istnieje dowód:

Po usunięciu msbuild.dll

msbuild.dll to w rzeczywistości msbuild.exe, jak widać we właściwościach:

Właściwości msbuild.dll pakietu SDK 1.0.3

Jakiś kod

Jeśli spojrzysz na kod interfejsu wiersza polecenia dotnet, zobaczysz, że generuje msbuildpolecenia.

Na przykład dotnet restorejest tworzony przez RestoreCommandklasę wewnątrz interfejsu wiersza polecenia dotnet .

Wersja okrojona:

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();
    }
    ...
}

Widzisz, dotnet restoreto tylko dzwonieniemsbuild /NoLogo /t:Restore /ConsoleLoggerParameters:Verbosity=Minimal


Jeśli sprawdzisz RestoreCommandw czasiedotnet v1.0.0 RC2 , nie korzystał, msbuildale dzwonił nugetbezpośrednio.

return NuGet3.Restore(args, quiet);

Mapowanie między dotnetamsbuild

Zrobiłem mapowanie między dotneta msbuild. Nie jest kompletna, ale są tam ważne polecenia.

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: dodawanie / usuwanie pakietów do csproj, również ograniczony zestaw nuget.exe, zobacz porównanie

PS brak tabel przecenowych w SO :(

juliański
źródło
msbuildnie przywraca pakietów NuGet, więc nie sądzę, aby można było powiedzieć „oba działają dobrze” bez nieco większego kontekstu. Pozostałe części wyglądają dobrze.
Lex Li
5
msbuild /t:restoreto nowe przywracanie. Pokazałem to z kodem. Jest nowy (jak wcześniej dotnetzostało nie za pomocą msbuild)
Julian
Świetna odpowiedź… Mam jeszcze jedno pytanie (zaktualizowałem oryginalne pytanie). Gdybyś mógł odpowiedzieć, byłbym bardzo wdzięczny i przyjmuję twoją odpowiedź
kimsagro
Dobre pytanie. Nie byłem pewien i przetestowałem to. Wniosek: używa własnego pliku msbuild.dll. Zaktualizowano post.
Julian