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 dotnet
jest 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, dotnet
a nie msbuild
. Było to uciążliwe, ponieważ wiele rzeczy, które zostały już zbudowane, msbuild
nie działało dobrze po dotnet
wyjęciu z pudełka (np. Xamarin). Więc przenieśli się do rzeczy msbuild
i zbudować dotnet
na szczycie msbuild
.
dotnet
ma pewne funkcje, których nie ma msbuild
, na przykład dotnet new
. Moim zdaniem dotnet
jest łatwiejszy w obsłudze niż msbuild
tak wolę dotnet
.
Aby było to bardziej zrozumiałe, dodałem porównanie między msbuild
i dotnet
na 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 msbuild
brakował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 msbuild
polecenia.
Na przykład dotnet restore
jest tworzony przez RestoreCommand
klasę 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 restore
to tylko dzwonieniemsbuild /NoLogo /t:Restore /ConsoleLoggerParameters:Verbosity=Minimal
Jeśli sprawdzisz RestoreCommand
w czasiedotnet v1.0.0 RC2
, nie korzystał, msbuild
ale dzwonił nuget
bezpośrednio.
return NuGet3.Restore(args, quiet);
Mapowanie między dotnet
amsbuild
Zrobiłem mapowanie między dotnet
a 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 :(
msbuild
nie 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.msbuild /t:restore
to nowe przywracanie. Pokazałem to z kodem. Jest nowy (jak wcześniejdotnet
zostało nie za pomocą msbuild)