Beziehung zwischen dem dotnet cli und dem neuen vs2017 msbuild

88

Mit der Umstellung project.jsonauf das neue csprojFormat, das mit VS2017 eingeführt wurde, habe ich Schwierigkeiten, den Unterschied zwischen dem dotnetCLI und dem neuen zu verstehen msbuildund wann ich eines über dem anderen verwenden soll.

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

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

3) Ist es dotnet clieigenständig oder muss es msbuildinstalliert werden?. Wenn Sie beispielsweise das dotnet SDK installieren, installiert dies auch msbuild? Wenn ja, unterscheidet sich dies von der Version, die mit vs2017 installiert ist?

kimsagro
quelle

Antworten:

147

Fragen

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

Beides funktioniert gut, da es derzeit darauf aufgebaut dotnetist msbuild. Es ist also Geschmackssache. Sie können msbuild-Aufgaben auch über die dotnet-CLI aufrufen. ( dotnet msbuild <msbuild_arguments>)

Am Anfang war das gesamte .NET-Kernmaterial nur in dotnetund nicht in msbuild. Dies war umständlich, da viele Dinge, auf denen bereits aufgebaut msbuildwar, nicht dotnetsofort einsatzbereit waren (z. B. Xamarin). Also haben sie das Zeug dorthin gebracht msbuildund dotnetdarauf aufgebaut msbuild.

dotnethat einige Funktionen, die nicht in sind msbuild, wie dotnet new. Meiner Meinung nach dotnetist es einfacher zu bedienen als msbuild, also bevorzuge ich dotnet.

Um es klarer zu machen, habe ich einen Vergleich zwischen msbuildund dotnetam Ende meines Beitrags hinzugefügt .

2) Meines Wissens nach gibt es auch zwei Versionen von msbuild, eine, die auf dem vollständigen Framework basiert, und eine andere, die auf den Dotnet-Kern abzielt. Ist das richtig? Sollte ich immer die Dotnet-Version verwenden

Es gibt nur einen msbuild. dotnet CLI verwendet msbuild:

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

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

In der älteren Version von msbuildfehlte die .NET Core-Unterstützung. Vielleicht ist das die andere Version;)

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

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

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 herausgefunden, dass die Datei msbuild.dll im SDK-Ordner verwendet wird. zB "C: \ Programme \ dotnet \ sdk \ 1.0.3 \ MSBuild.dll"

Wenn Sie diesen entfernen, gibt es einen Beweis:

Wenn msbuild.dll entfernt wird

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

msbuild.dll-Eigenschaften von SDK 1.0.3

Etwas Code

Wenn Sie sich den Code der Dotnet-CLI ansehen, können Sie sehen, dass sie msbuildBefehle generiert .

Wird beispielsweise dotnet restorevon der RestoreCommandKlasse 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();
    }
    ...
}

Sie können sehen, dotnet restoreruft nur anmsbuild /NoLogo /t:Restore /ConsoleLoggerParameters:Verbosity=Minimal


Wenn Sie RestoreCommandzum Zeitpunktdotnet v1.0.0 RC2 einchecken , wurde es nicht verwendet, msbuildsondern nugetdirekt angerufen .

return NuGet3.Restore(args, quiet);

Zuordnung zwischen dotnetundmsbuild

Ich habe ein Mapping zwischen dotnetund gemacht msbuild. 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, ebenfalls begrenzter Satz von nuget.exe, siehe Vergleich

PS keine Markdown-Tabellen in SO :(

julianisch
quelle
msbuildstellt NuGet-Pakete nicht wieder her, daher kann man ohne ein bisschen mehr Kontext nicht sagen, dass beide gut funktionieren. Andere Teile sehen gut aus.
Lex Li
5
msbuild /t:restoreist die neue Wiederherstellung. Zeigte es mit Code. Es ist neu (wie zuvor dotnetwurde nicht mit msbuild)
Julian
Tolle Antwort. Ich habe nur noch eine Frage (ich habe die ursprüngliche Frage aktualisiert). Wenn Sie antworten könnten, würde ich es sehr schätzen und werde Ihre Antwort akzeptieren
kimsagro
Gute Frage. Ich war mir nicht sicher und habe es getestet. Fazit: Es verwendet seine eigene msbuild.dll. Der Beitrag wurde aktualisiert.
Julian