107 votes

Relation entre le dotnet cli et le nouveau vs2017 msbuild

Avec le passage de l' project.json pour la nouvelle - csproj format introduit avec VS2017, j'ai du mal à comprendre la différence entre le dotnet de la cli et de la nouvelle - msbuild et quand utiliser l'un sur l'autre.

1) Pour la construction d'un nouveau csproj netstandard bibliothèque à partir de la ligne de commande, devrais-je appeler l' dotnet de la cli (par exemple, dotnet restore dotnet build) ou utiliser msbuild (par exemple, msbuild ExampleNetstandard.sln).

2) Aussi, ma compréhension est qu'il existe deux versions de l' msbuild, on a construit sur la totalité du cadre et l'autre ciblant dotnet core. Est-ce correct? Dois-je toujours utiliser l' dotnet version

3) Est - dotnet cli autonome ou nécessite-t-il msbuild pour être installée?. Par exemple, lorsque vous installez le dotnet SDK est-ce à installer msbuild ainsi? Si oui, est-ce différent de la version qui est installé avec vs2017?

177voto

Julian Points 972

Questions

1) Pour la construction d'un nouveau csproj netstandard bibliothèque à partir de la ligne de commande, devrais-je appeler le dotnet cli (par exemple dotnet restaurer dotnet construire) ou utiliser msbuild (par exemple msbuild ExampleNetstandard.sln).

Les deux beaux-comme actuellement, dotnet est construit au sommet d' msbuild. C'est donc une question de goût. Vous pouvez aussi appeler msbuild tâches en utilisant dotnet CLI. (dotnet msbuild <msbuild_arguments>)

Au début, tous les .NET essentiel était seulement en dotnet et non pas en msbuild. C'était lourd comme beaucoup de choses qui a déjà été construit sur msbuild ne fonctionnait pas bien avec dotnet de la zone (par exemple, Xamarin). Donc, ils ont déplacé les choses à l' msbuild et de construire dotnet sur le haut de l' msbuild.

dotnet a certaines fonctionnalités qui ne sont pas en msbuild, comme dotnet new. À mon avis, dotnet est plus facile à utiliser que msbuild, donc je préfère dotnet.

Pour rendre cela plus clair, j'ai ajouté une comparaison entre msbuild et dotnet à la fin de mon post.

2) Aussi, ma compréhension est qu'il existe deux versions de msbuild, on a construit sur la totalité du cadre et l'autre ciblant dotnet de base. Est-ce correct? Dois-je toujours utiliser la version dotnet

Il y a un seul msbuild. dotnet interface de ligne de commande à l'aide de msbuild:

Depuis la CLI utilise MSBuild que son moteur de construction, nous recommandons que ces parties de l'outil être écrit comme la coutume MSBuild des objectifs et des tâches, car ils peuvent alors participer à l'ensemble du processus de construction

https://docs.microsoft.com/en-us/dotnet/articles/core/tools/extensibility

L'ancienne version de l' msbuild a été dépourvues de la .NET de soutien de Base. Peut-être que c'est l'autre version ;)

Je suis d'accord c'est source de confusion, car il était très différent il y a quelques mois.

3) Est dotnet cli autonome ou nécessite-t-il msbuild pour être installé?. Par exemple, lorsque vous installez le dotnet SDK est-ce à installer msbuild ainsi? Si oui, est-ce différent de la version qui est installé avec vs2017?

Je n'étais pas sûr de cela, mais il était facile de test. J'ai supprimé toutes les msbuild.exe et il fonctionnait toujours. Trouvé, c'est à l'aide de la msbuild.dll dans le répertoire du SDK. par exemple, "C:\Program Files\dotnet\sdk\1.0.3\MSBuild.dll"

Si vous supprimer un, il est une preuve:

When msbuild.dll removed

msbuild.dll est en fait msbuild.exe comme vous pouvez le voir dans les propriétés:

msbuild.dll properties of SDK 1.0.3

Un peu de code

Si vous regardez dans le code de la dotnet CLI, vous pouvez le voir, c'est de générer msbuild `commandes.

Par exemple dotnet restore, est créé par l' RestoreCommand classe à l'intérieur de dotnet CLI.

Une dépouillé 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();
    }
    ...
}

Vous pouvez voir dotnet restore est juste appelant msbuild /NoLogo /t:Restore /ConsoleLoggerParameters:Verbosity=Minimal


Si vous cochez RestoreCommand du temps d' dotnet v1.0.0 RC2, il n'était pas à l'aide de msbuild mais appelait nuget directement.

return NuGet3.Restore(args, quiet);

Correspondance entre dotnet et msbuild

J'ai fait une correspondance entre l' dotnet et msbuild. Il n'est pas complet, mais les commandes importantes sont là.

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: Ajout/suppression de paquets de csproj, aussi limitée nuget.exe, voir la comparaison

PS pas de démarques des tables dans la :(

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X