Зв'язок між dotnet cli та новою версією ms2017 vs2017


84

З переходом від project.jsonнового csprojформату, представленого з VS2017, я намагаюся зрозуміти різницю між dotnetкліпом та новим, msbuildі коли використовувати один над іншим.

1) Щоб створити нову csprojнестандартну бібліотеку з командного рядка, чи повинен я викликати dotnetcli (наприклад dotnet restore dotnet build) або використовувати msbuild(наприклад msbuild ExampleNetstandard.sln).

2) Крім того, я розумію, що існує дві версії msbuild, одна побудована на повному фреймворку, а інша націлена dotnet core. Це правильно? Чи завжди мені використовуватиdotnet version

3) Чи є dotnet cliавтономним або його потрібно msbuildвстановити ?. Наприклад, коли ви встановлюєте dotnet SDK, це також встановлює msbuild? Якщо так, чи це відрізняється від версії, встановленої з vs2017?

Відповіді:


142

Питання

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.dll насправді є msbuild.exe, як ви можете бачити у властивостях:

msbuild.dll властивості SDK 1.0.3

Якийсь код

Якщо ви вивчите код 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, тому я не думаю, що ви можете сказати "обидва добре" без трохи більше контексту. Інші деталі виглядають добре.
Лекс Лі

5
msbuild /t:restore- це нове відновлення. Показав це з кодом. Це новий (як раніше dotnetбуло НЕ з допомогою MSBuild)
Julian

Чудова відповідь .. У мене є ще одне запитання (я оновив вихідне запитання). Якщо б ви могли відповісти, що я буду дуже вдячний і прийму вашу відповідь
kimsagro

Хороше питання. Я не був упевнений і протестував це. Висновок: він використовує власний файл msbuild.dll. Оновив пост.
Джуліан,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.