Питання
1) Для створення нової бібліотеки csproj netstandard з командного рядка, чи повинен я викликати dotnet cli (наприклад, dotnet відновлення dotnet build) або використовувати msbuild (наприклад msbuild ExampleNetstandard.sln).
І те, і інше чудово, оскільки в даний час dotnet
побудовано поверх msbuild
. Тож справа смаку. Ви також можете викликати завдання msbuild за допомогою dotnet CLI. ( dotnet msbuild <msbuild_arguments>
)
На початку всі основні матеріали .NET були лише в, dotnet
а не в msbuild
. Це було громіздко, оскільки багато речей, на яких вже побудовано, msbuild
не працювали добре з dotnet
коробки (наприклад, Xamarin). Тож вони перенесли речі msbuild
і будували dotnet
поверх них msbuild
.
dotnet
має деякі функції, яких немає msbuild
, наприклад dotnet new
. На мій погляд, dotnet
це простіше у використанні, ніж msbuild
, тому я віддаю перевагу dotnet
.
Щоб було зрозуміліше, я додав порівняння між msbuild
та dotnet
в кінці мого допису.
2) Крім того, я розумію, що існує дві версії msbuild, одна побудована на повному фреймворку, а інша націлена на ядро dotnet. Це правильно? Чи повинен я завжди використовувати версію dotnet
Існує лише один msbuild. dotnet CLI використовує msbuild:
Оскільки CLI використовує MSBuild як механізм побудови, ми рекомендуємо писати ці частини інструменту як власні цілі та завдання MSBuild, оскільки вони можуть брати участь у загальному процесі побудови
https://docs.microsoft.com/en-us/dotnet/articles/core/tools/extensibility
У старій версії не msbuild
було підтримки .NET Core. Можливо, це інша версія;)
Я згоден, що це бентежить, оскільки кілька місяців тому це було зовсім інакше.
3) Чи є dotnet cli автономним або для його встановлення потрібна програма msbuild ?. Наприклад, коли ви встановлюєте dotnet SDK, це також встановлює msbuild? Якщо так, чи це відрізняється від версії, встановленої з vs2017?
Я не був впевнений у цьому, але це було легко перевірити. Я видалив весь файл msbuild.exe, і він все ще працював. З’ясував, що він використовує msbuild.dll у папці SDK. наприклад, "C: \ Program Files \ dotnet \ sdk \ 1.0.3 \ MSBuild.dll"
Якщо ви його видалите, є доказ:
msbuild.dll насправді є msbuild.exe, як ви можете бачити у властивостях:
Якийсь код
Якщо ви вивчите код dotnet CLI, ви побачите, що він генерує msbuild
команди.
Наприклад dotnet restore
, створюється RestoreCommand
класом всередині dotnet CLI .
Зачищена версія:
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();
}
...
}
Бачите, dotnet restore
це просто дзвінокmsbuild /NoLogo /t:Restore /ConsoleLoggerParameters:Verbosity=Minimal
Якщо ви зареєструвались RestoreCommand
під часdotnet v1.0.0 RC2
, він не використовував, msbuild
а дзвонив nuget
безпосередньо.
return NuGet3.Restore(args, quiet);
Картування між dotnet
іmsbuild
Я зробив відображення між dotnet
і msbuild
. Це ще не все, але важливі команди є.
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: Додавання / видалення пакетів до csproj, також обмежений набір nuget.exe, див. порівняння
PS немає таблиць націнки в SO :(
msbuild
не відновлює пакунки NuGet, тому я не думаю, що ви можете сказати "обидва добре" без трохи більше контексту. Інші деталі виглядають добре.