it-swarm.com.de

Beziehung zwischen dem Punktnetz-Cli und dem neuen vs2017 msbuild

Bei der Umstellung von project.json Auf das neue Format csproj, das mit VS2017 eingeführt wurde, fällt es mir schwer, den Unterschied zwischen der dotnet -Cli und der neuen msbuild -Cli zu verstehen. und wann man eins über dem anderen benutzt.

1) Um eine neue csproj - Netzwerkstandardbibliothek über die Befehlszeile zu erstellen, muss ich die dotnet - Befehlszeile aufrufen (zum Beispiel dotnet restoredotnet build) Oder msbuild (zum Beispiel msbuild ExampleNetstandard.sln).

2) Ich verstehe auch, dass es zwei Versionen von msbuild gibt, eine, die auf dem vollständigen Framework basiert, und eine andere, die auf dotnet core Abzielt. Ist das richtig? Soll ich immer den dotnet version

3) Ist dotnet cli Eigenständig oder muss msbuild installiert werden? Wenn Sie beispielsweise das dotnet SDK installieren, wird dann auch msbuild installiert? Wenn ja, unterscheidet sich dies von der mit vs2017 installierten Version?

59
kimsagro

Fragen

1) Um eine neue csproj netstandard-Bibliothek über die Befehlszeile zu erstellen, muss ich die dotnet cli aufrufen (zum Beispiel dotnet restore dotnet build) oder msbuild verwenden (zum Beispiel msbuild ExampleNetstandard.sln).

Beide funktionieren einwandfrei, da dotnet derzeit auf msbuild aufgebaut ist. Es ist also Geschmackssache. Sie können msbuild-Tasks auch über die Dotnet-CLI aufrufen. (dotnet msbuild <msbuild_arguments>)

Am Anfang befanden sich alle .NET-Kernelemente nur in dotnet und nicht in msbuild. Dies war umständlich, da viele Dinge, die bereits mit msbuild erstellt wurden, nicht sofort mit dotnet kompatibel waren (z. B. Xamarin). Also haben sie das Zeug nach msbuild verschoben und dotnet über msbuild gebaut.

dotnet hat einige Funktionen, die nicht in msbuild enthalten sind, wie dotnet new. Meiner Meinung nach ist dotnet einfacher zu verwenden als msbuild, daher bevorzuge ich dotnet.

Zum besseren Verständnis habe ich am Ende meines Beitrags einen Vergleich zwischen msbuild und dotnet eingefügt.

2) Ich verstehe auch, dass es zwei Versionen von msbuild gibt, eine, die auf dem vollständigen Framework basiert, und eine andere, die auf den Dotnet-Kern abzielt. Ist das richtig? Soll ich immer die dotnet Version benutzen

Es gibt nur ein msbuild. dotnet CLI verwendet msbuild:

Da CLI MSBuild als Build-Engine verwendet, empfehlen wir, diese Teile des Tools als benutzerdefinierte MSBuild-Ziele und -Tasks zu schreiben, da sie dann am gesamten Build-Prozess teilnehmen können

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

Der älteren Version von msbuild fehlte die .NET Core-Unterstützung. Vielleicht ist das die andere Version;)

Ich bin damit einverstanden, dass es verwirrend ist, da es vor ein paar Monaten ganz anders war.

3) Ist dotnet cli eigenständig oder muss msbuild installiert werden? Wenn Sie beispielsweise das dotnet SDK installieren, wird dann auch msbuild installiert? Wenn ja, unterscheidet sich dies von der mit vs2017 installierten Version?

Ich war mir nicht sicher, aber es war einfach zu testen. Ich habe alle msbuild.exe entfernt und es hat immer noch funktioniert. Es wurde festgestellt, dass die Datei msbuild.dll im SDK-Ordner verwendet wird. z.B. "C:\Programme\dotnet\sdk\1.0.3\MSBuild.dll"

Wenn Sie diesen entfernen, gibt es einen Beweis:

When msbuild.dll removed

msbuild.dll ist eigentlich msbuild.exe, wie Sie in den Eigenschaften sehen können:

msbuild.dll properties of SDK 1.0.3

Ein bisschen Code

Wenn Sie sich den Code der Dotnet-CLI ansehen, sehen Sie, dass er msbuild Befehle generiert.

Beispielsweise dotnet restore, wird von der Klasse RestoreCommand in der Dotnet-CLI erstellt .

Eine abgespeckte Version:

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

Du kannst sehen dotnet restore ruft nur msbuild /NoLogo /t:Restore /ConsoleLoggerParameters:Verbosity=Minimal


Wenn Sie RestoreCommand in der Zeit von dotnet v1.0.0 RC2 , es wurde nicht msbuild verwendet, sondern nuget direkt aufgerufen.

return NuGet3.Restore(args, quiet);

Zuordnung zwischen dotnet und msbuild

Ich habe eine Zuordnung zwischen dotnet und msbuild vorgenommen. Es ist nicht vollständig, aber die wichtigen Befehle sind da.

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: Hinzufügen/Entfernen von Paketen zu csproj, auch begrenzter Satz von nuget.exe, siehe Vergleich

PS keine Markdown-Tabellen in SO: (

97
Julian