Relación entre dotnet cli y el nuevo msbuild vs2017

84

Con el cambio del project.jsonnuevo csprojformato introducido con VS2017, estoy luchando por comprender la diferencia entre el dotnetcli y el nuevo msbuildy cuándo usar uno sobre el otro.

1) Para construir una nueva csprojbiblioteca netstandard desde la línea de comando, ¿debo llamar al dotnetcli (por ejemplo dotnet restore dotnet build) o usar msbuild(por ejemplo msbuild ExampleNetstandard.sln).

2) Además, tengo entendido que hay dos versiones de msbuild, una construida en el marco completo y otra dirigida dotnet core. ¿Es esto correcto? ¿Debería usar siempre eldotnet version

3) ¿Es dotnet cliautónomo o es necesario msbuildinstalarlo? Por ejemplo, cuando instala el dotnet SDK, ¿esto también instala msbuild? Si es así, ¿es diferente a la versión que se instala con vs2017?

kimsagro
fuente

Respuestas:

142

Preguntas

1) Para crear una nueva biblioteca csproj netstandard desde la línea de comandos, ¿debería llamar a la cli de dotnet (por ejemplo, dotnet restore dotnet build) o usar msbuild (por ejemplo, msbuild ExampleNetstandard.sln).

Ambos funcionan bien, ya que actualmente dotnetse basa en msbuild. Entonces es cuestión de gustos. También puede llamar a las tareas de msbuild mediante la CLI de dotnet. ( dotnet msbuild <msbuild_arguments>)

Al principio, todas las cosas del núcleo de .NET solo estaban dentro dotnety no msbuild. Esto era engorroso porque muchas cosas que ya estaban construidas msbuildno funcionaban bien dotnetde forma inmediata (por ejemplo, Xamarin). Así que movieron las cosas msbuildy construyeron dotnetencima de msbuild.

dotnettiene algunas características que no están en msbuild, como dotnet new. En mi opinión, dotnetes más fácil de usar que msbuild, por eso prefiero dotnet.

Para que quede más claro, agregué una comparación entre msbuildy dotnetal final de mi publicación.

2) Además, tengo entendido que hay dos versiones de msbuild, una construida en el marco completo y otra dirigida al núcleo dotnet. ¿Es esto correcto? ¿Debo usar siempre la versión dotnet?

Solo hay un msbuild. dotnet CLI está usando msbuild:

Dado que CLI usa MSBuild como su motor de compilación, recomendamos que estas partes de la herramienta se escriban como objetivos y tareas personalizados de MSBuild, ya que luego pueden participar en el proceso de compilación general

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

La versión anterior de msbuildcarecía de la compatibilidad con .NET Core. Quizás esa sea la otra versión;)

Estoy de acuerdo en que es confuso, ya que hace unos meses era muy diferente.

3) ¿Dotnet cli es independiente o requiere que se instale msbuild? Por ejemplo, cuando instala dotnet SDK, ¿esto también instala msbuild? Si es así, ¿es diferente a la versión que se instala con vs2017?

No estaba seguro de esto, pero fue fácil de probar. He eliminado todo msbuild.exe y todavía funciona. Descubrí que está usando msbuild.dll en la carpeta SDK. por ejemplo, "C: \ Archivos de programa \ dotnet \ sdk \ 1.0.3 \ MSBuild.dll"

Si quita ese, hay una prueba:

Cuando se eliminó msbuild.dll

msbuild.dll es en realidad msbuild.exe, como puede ver en las propiedades:

Propiedades de msbuild.dll de SDK 1.0.3

Algún código

Si observa el código de la CLI de dotnet, puede ver que está generando msbuildcomandos.

Por ejemplo dotnet restore, es creado por la RestoreCommandclase dentro de la CLI de dotnet .

Una versión desnuda:

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();
    }
    ...
}

Puedes ver dotnet restoreque solo está llamandomsbuild /NoLogo /t:Restore /ConsoleLoggerParameters:Verbosity=Minimal


Si marca RestoreCommandel tiempo dedotnet v1.0.0 RC2 , no estaba usando msbuildpero estaba llamando nugetdirectamente.

return NuGet3.Restore(args, quiet);

Mapeo entre dotnetymsbuild

Hice un mapeo entre dotnety msbuild. No está completo, pero los comandos importantes están ahí.

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: agregar / eliminar paquetes a csproj, también conjunto limitado de nuget.exe, ver comparación

PD: no hay tablas de rebajas en SO :(

Julian
fuente
msbuildno restaura los paquetes NuGet, por lo que no creo que pueda decir "ambos funcionan bien" sin un poco más de contexto. Otras partes se ven bien.
Lex Li
5
msbuild /t:restorees la nueva restauración. Lo mostró con código. Es nuevo (como antes nodotnet estaba usando msbuild)
Julián
Gran respuesta ... Solo tengo una pregunta más (he actualizado la pregunta original). Si pudiera responder que lo agradecería mucho y aceptaré su respuesta
kimsagro
Buena pregunta. No estaba seguro y lo probé. Conclusión: utiliza su propio msbuild.dll. Actualizó la publicación.
Juliano