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 dotnet
se 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 dotnet
y no msbuild
. Esto era engorroso porque muchas cosas que ya estaban construidas msbuild
no funcionaban bien dotnet
de forma inmediata (por ejemplo, Xamarin). Así que movieron las cosas 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
, por eso prefiero dotnet
.
Para que quede más claro, agregué una comparación entre msbuild
y dotnet
al 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 msbuild
carecí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 msbuild
comandos.
Por ejemplo dotnet restore
, es creado por la RestoreCommand
clase 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 restore
que solo está llamandomsbuild /NoLogo /t:Restore /ConsoleLoggerParameters:Verbosity=Minimal
Si marca RestoreCommand
el tiempo dedotnet v1.0.0 RC2
, no estaba usando msbuild
pero estaba llamando nuget
directamente.
return NuGet3.Restore(args, quiet);
Mapeo entre dotnet
ymsbuild
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: agregar / eliminar paquetes a csproj, también conjunto limitado de nuget.exe, ver comparación
PD: no hay tablas de rebajas en SO :(
msbuild
no 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:restore
es la nueva restauración. Lo mostró con código. Es nuevo (como antes nodotnet
estaba usando msbuild)