Relación entre dotnet cli y el nuevo vs2017 msbuild


Con el paso de project.json al nuevo formato csproj introducido con VS2017, me cuesta entender la diferencia entre la cli dotnet y la nueva msbuild y cuándo usar una sobre la otra.

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

2) También, mi entendimiento es que hay dos versiones de msbuild, una construida sobre el marco completo y otro objetivo dotnet core. ¿Es correcto? ¿Debería usar siempre el dotnet version

3) Es dotnet cli independiente o requiere msbuild para ser instalado?. Por ejemplo, cuando instala el SDK dotnet, ¿también instala msbuild? Si es así, ¿es diferente a la versión que se instala con vs2017?

Author: Julian, 2017-04-15

1 answers

Preguntas

1) Para construir una nueva biblioteca netstandard de csproj 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 dotnet está construido sobre msbuild. Así que es una cuestión de gustos. También puede llamar a tareas de msbuild utilizando la CLI de dotnet. (dotnet msbuild <msbuild_arguments>)

Al principio, todas las cosas del núcleo. NET estaban solo en dotnet y no en msbuild. Esto era engorroso ya que muchas cosas que ya estaban construidas en msbuild no funcionaban bien con dotnet fuera de la caja (por ejemplo, Xamarin). Así que movieron las cosas a msbuild y construyeron dotnet encima de msbuild.

dotnet tiene algunas características que no están en msbuild como dotnet new. En mi opinión, dotnet es más fácil de usar que msbuild, así que prefiero dotnet.

Para que sea más claro, he añadido una comparación entre msbuild y dotnet al final de mi post.

2) También, mi se entiende que hay dos versiones de msbuild, una construida en el marco completo y otra dirigida a dotnet core. ¿Es correcto? Debo usar siempre la versión dotnet

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

Dado que CLI utiliza 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 pueden participar en la compilación general proceso

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

La versión anterior de msbuild carecía del soporte.NET Core. Tal vez esa es la otra versión;)

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

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

No estaba seguro de esto, pero fue fácil de probar. He eliminado todos los msbuild.exe y todavía funcionó. Descubrí que está usando el msbuild.dll en la carpeta SDK. p. ej. "C:\Program Files\dotnet \ sdk \ 1.0.3 \ MSBuild.dll"

Si quitas esa, hay una prueba: {[40]]}

Cuando msbuild.dll eliminado

Msbuild.dll es en realidad msbuild.exe, como se puede ver en el propiedades:

msbuild.dll propiedades de SDK 1.0.3

Algún código

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

Por ejemplo dotnet restore, es creado por el RestoreCommand clase dentro de dotnet CLI.

Una versión despojada:

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 que dotnet restore está llamando a msbuild /NoLogo /t:Restore /ConsoleLoggerParameters:Verbosity=Minimal


Si comprueba RestoreCommand en el tiempo de dotnet v1.0.0 RC2, no estaba usando msbuild pero estaba llamando nuget directamente.

return NuGet3.Restore(args, quiet);

Mapeo entre dotnet y msbuild

Hice un mapeo entre dotnet y 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: Adición / eliminación de paquetes a csproj, también conjunto limitado de nuget.exe, véase comparación

PS no hay tablas de reducción en SO :(

 54
Author: Julian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-17 18:08:48