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:

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

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 :(
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.