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:

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

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