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 dotnet
ist 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 dotnet
und nicht in msbuild
. Dies war umständlich, da viele Dinge, auf denen bereits aufgebaut msbuild
war, nicht dotnet
sofort einsatzbereit waren (z. B. Xamarin). Also haben sie das Zeug dorthin gebracht msbuild
und dotnet
darauf aufgebaut msbuild
.
dotnet
hat einige Funktionen, die nicht in sind msbuild
, wie dotnet new
. Meiner Meinung nach dotnet
ist es einfacher zu bedienen als msbuild
, also bevorzuge ich dotnet
.
Um es klarer zu machen, habe ich einen Vergleich zwischen msbuild
und dotnet
am 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 msbuild
fehlte 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 msbuild
Befehle generiert .
Wird beispielsweise dotnet restore
von der RestoreCommand
Klasse 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 restore
ruft nur anmsbuild /NoLogo /t:Restore /ConsoleLoggerParameters:Verbosity=Minimal
Wenn Sie RestoreCommand
zum Zeitpunktdotnet v1.0.0 RC2
einchecken , wurde es nicht verwendet, msbuild
sondern nuget
direkt angerufen .
return NuGet3.Restore(args, quiet);
Zuordnung zwischen dotnet
undmsbuild
Ich habe ein Mapping zwischen dotnet
und 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 :(
msbuild
stellt NuGet-Pakete nicht wieder her, daher kann man ohne ein bisschen mehr Kontext nicht sagen, dass beide gut funktionieren. Andere Teile sehen gut aus.