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:

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

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 :(
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.msbuild /t:restorees la nueva restauración. Lo mostró con código. Es nuevo (como antes nodotnetestaba usando msbuild)